En Delphi , usando FloatToStrF
o CurrToStrF
usará automáticamente el carácter DecimalSeparator
para representar una marca decimal. Desafortunadamente DecimalSeparator
is declared in SysUtils as Char
1,2:Cómo convertir float o currency a una cadena localizada?
var
DecimalSeparator: Char;
Mientras que el LOCALE_SDECIMAL
se le permite tener hasta tres personajes:
de caracteres (s) utilizados para el separador decimal, por ejemplo, "" en "3.14" o "," en "3,14". La cantidad máxima de caracteres permitidos para esta cadena es cuatro, incluido un carácter nulo de terminación.
Esto causa que Delphi no lea el separador decimal correctamente; cayendo de nuevo a asumir un separador predeterminado decimal de ".
":
DecimalSeparator := GetLocaleChar(DefaultLCID, LOCALE_SDECIMAL, '.');
En mi ordenador, which is quite a character, esta causa los valores de punto flotante y de divisas a ser localizados de forma incorrecta con una marca de U+002E (punto) decimal.
i am dispuesto a llamar a las funciones de API de Windows directamente, que están diseñados para convertir en punto flotante, o la moneda, los valores en una cadena localizada:
Excepto estas funciones toman una serie de códigos de imagen , donde los únicos caracteres permitidos son:
- caracteres "0" a "9" (
U+0030
..U+0039
) - Un punto decimal (
.
) si el número es un valor de coma flotante (U+002E
) - Un signo menos en la primera posición de carácter si el número es un valor negativo (
U+002D
)
lo que sería una buena manera para convertir un punto flotante, o la moneda, valor en una cadena que obedece a los ¿reglas? p.ej.
1234567.893332
-1234567
dado que la configuración regional del usuario local (es decir, mi equipo):
- no podría utilizar un
-
para indicar negativa (por ejemplo--
) - might not use a
.
to indicate a decimal point (por ej.,,
) - might not use the latin alphabet
to represent digits (por ejemplo,[dígitos borrados arábiga ese choque analizador SO javascript])
A horrible, horrible, corte, que podría utilizar:
function FloatToLocaleIndependantString(const v: Extended): string;
var
oldDecimalSeparator: Char;
begin
oldDecimalSeparator := SysUtils.DecimalSeparator;
SysUtils.DecimalSeparator := '.'; //Windows formatting functions assume single decimal point
try
Result := FloatToStrF(Value, ffFixed,
18, //Precision: "should be 18 or less for values of type Extended"
9 //Scale 0..18. Sure...9 digits before decimal mark, 9 digits after. Why not
);
finally
SysUtils.DecimalSeparator := oldDecimalSeparator;
end;
end;
información adicional sobre la cadena de funciones que utiliza el VCL:
FloatToStrF
yCurrToStrF
llamadas:FloatToText
llamadas:
Nota
DecimalSeparator: Char
, el single character global is deprecated, y sustituido por otro carácter único separador decimal
en mi versión de Delphi
y en las versiones actuales de Delphi
+1 Siempre me gusta leer sus preguntas. –
Ciertamente puede tomar mucho tiempo escribir, formatear, vincular, etc. Y en este caso, una iteración anterior que incluía números arábigos colapsó SO. Es bueno saber que el esfuerzo no es menospreciado. –
Usted está en delphi5. Desde Delphi2007 puede llamar con un conjunto separado de ajustes de formato para todas esas funciones de formato. Es hora de intensificar? –