Ver Mensaje Individual
  #14  
Antiguo 18-05-2008
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Reputación: 21
mlara Va por buen camino
Cita:
Empezado por kuan-yiu Ver Mensaje
...
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.
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre.

Última edición por mlara fecha: 18-05-2008 a las 16:09:32.
Responder Con Cita