Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #7  
Antiguo 18-05-2008
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Poder: 24
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
 


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Separador de miles como separador decimal jmselesan OOP 4 12-06-2011 22:21:54
Agregar separador de miles mjjj Varios 5 21-11-2007 10:51:15
Formato de separador decimal MaMu Conexión con bases de datos 4 28-06-2007 14:47:14
Como setear el separador decimal y el separador de miles en WIN98 robertoe API de Windows 3 26-11-2006 17:12:02
dichoso separador decimal Lepe Conexión con bases de datos 8 19-04-2004 21:48:25


La franja horaria es GMT +2. Ahora son las 14:23:08.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi