Cita:
Empezado por kuan-yiu
...
Código Delphi [-]ThousandSeparator := ',';
DecimalSeparator := '.';
Mi problema con cantidades como: 1.627,63 o su otra versión 1,627.63, o esta 1627,63, o esta 1627.63; escritas tal cual en un edit, con el teclado numérico o con el otro o incluso copiadas desde un documento excel (ya he visto de todo en el manejo de la aplicación).
¿Cómo proceso esto? "strToFloat" no admite como números los que tienen ambos separadores o los transforma mal...[/b]
|
Cuando asignas el valor a DecimalSeparator y ThousandSeparator,
StrToFloat convierte una cadena numérica que use el separador decimal asignado a tipo número, pero no toma el separador de miles; ¿por qué? Por esta razón: Qué pasa si tu cliente escribe: 150,000.83? La coma está bien situada, pero si escribe: 1500,00.83? mmm ahí está. Esto no sucedería si usaras un TMaskEdit. Pero suponiendo que no lo usas, pues por qué no usas esta función:
Código:
function CustomStrToFloat(S: string): Extended;
var
SWTS: string; // S sin separador de miles (S Without Thousand Separator)
begin
SWTS := S;
while Pos(ThousandSeparator, SWTS) > 0 do
SWTS := AnsiReplaceStr(SWTS, ThousandSeparator, '');
Result := StrToFloat(SWTS)
end;
Observa que se usa la misma variable
ThousandSeparator a la cual le abrás asignado su valor en el
OnCreate de la forma principal, según nos habías contado. Así queda solucionado tu problema.
Una variante de la función puede ser esta:
Código:
function CustomStrToFloat(S: string): Extended;
var
Fmt: TFormatSettings;
SWTS: string; // S sin separador de miles (S Without Thousand Separator)
begin
GetLocaleFormatSettings(GetSystemDefaultLCID, Fmt);
Fmt.DecimalSeparator := DecimalSeparator;
Fmt.ThousandSeparator := ThousandSeparator;
SWTS := S;
while Pos(ThousandSeparator, SWTS) > 0 do
SWTS := AnsiReplaceStr(SWTS, ThousandSeparator, '');
Result := StrToFloat(SWTS, Fmt)
end;
Observa que la función
StrToFloat ahora se ejecuta incluyendo el formato mediante la variable Fmt de tipo TFormatSettings. En verdad, así como está funciona igual que la anterior función, pero si en vez de usar las variables DecimalSeparator y ThousandSeparator, usas '.' y ',' según tu necesidad, pues tendrías un control total. Incluso hasta podrías pasar los caracteres como parámetro.
Por otra parte leí que querías usar como alternativa un TEdit que permitiera únicamente registrar números. Bueno, pues esto es muy sencillo, pues únicamente es necesario escribir el evento OnKeyPress:
Código:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if ((Key < '0') or (Key > '9')) and (Key <> #8) then
Key := #0;
end;
Espero que ahora sí esta ayuda te sirva.
Saludos.