Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-04-2008
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
Lightbulb Separador decimal y de miles, problemas con distintas configuraciones

Tengo instalada una aplicación en diferentes equipos, que están por toda España y que cada uno tiene una configuración regional distinta y tengo el típico problema con los separadores decimales y de miles porque cada ordenador está configurado de un modo diferente y en la mayoría de los casos no puedo cambiar esa configuración.

Ya he revisado los hilos sobre este tema y:
Código Delphi [-]
  ThousandSeparator  := ',';
  DecimalSeparator := '.';
No me funciona correctamente (tal vez lo estoy poniendo en el lugar incorrecto), ahora mismo lo tengo en el onCreate de mi formulario principal, el del menú.
También he probado a "hacerlo a mano", pasando cada número por funciones que sacan los puntos, pero como unos usan la coma y otros el punto como separador decimal y nunca sé en que caso me encuentro... tampoco funciona bien.
Encontré también en el foro que en torry.net hay algún tEdit que sólo permite introducir números y la idea me pareció perfecta... pero la página sigue caída

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...
¿Cómo detecto cual es la configuración de un ordenador?
¿Alguien tiene los componentes de torry.net para que pueda ver si me sirven?

...¿Alguna sugerencia?
Responder Con Cita
  #2  
Antiguo 16-04-2008
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
¡Me olvidaba!

Gracias a todos de antemano
Responder Con Cita
  #3  
Antiguo 16-04-2008
Avatar de defcon1_es
defcon1_es defcon1_es is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuenca - España
Posts: 533
Poder: 21
defcon1_es Va por buen camino
Cita:
Empezado por kuan-yiu Ver Mensaje
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).
Yo usaría TMaskEdit en vez de edits normales. Estos componentes validan los datos introducidos mediante una máscara que defines tu, con lo que te evitas ese tipo de errores.
Cita:
Empezado por kuan-yiu Ver Mensaje
¿Cómo proceso esto? "strToFloat" no admite como números los que tienen ambos separadores o los transforma mal...
Código Delphi [-]
type TConjuntoDigitosValidos = Set of Char;

function LimpiarFormatoNumero(Numero:String):String;
var contador :Integer;
    CadenaAuxiliar :String;
    ConjuntoValido :TConjuntoDigitosValidos;
begin
// Función que  devuelve el número de moneda sin
// separador de  miles ni espacios
  if Numero = ''
  then Result := '0'
  else begin
    ConjuntoValido := ['0','1','2','3','4','5','6','7','8','9','-'];
    ConjuntoValido := ConjuntoValido + [SysUtils.DecimalSeparator];
    CadenaAuxiliar := '';
    try
      for contador := 1 to length(Numero) do
      begin
        if (Numero[Contador] in ConjuntoValido)
        then begin
          CadenaAuxiliar := CadenaAuxiliar + Numero[Contador];
        end;
      end;
      if (CadenaAuxiliar = '') then CadenaAuxiliar := '0';
      Result := CadenaAuxiliar;
    except
      Result := '0';
    end;
  end;
end;
Cita:
Empezado por kuan-yiu Ver Mensaje
¿Cómo detecto cual es la configuración de un ordenador?
Basta con comprobar los datos de las variables
SysUtils.ThousandSeparator
SysUtils.DecimalSeparator
__________________
Progress Openedge
https://abevoelker.com/progress_open...dered_harmful/


Delphi forever...
Responder Con Cita
  #4  
Antiguo 16-04-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
En hilos relacionados tienes el "dichoso separador decimal" que tiene varias cositas en cuenta:
- cambiar el punto del teclado numérico por la coma (para usarlo como separador decimal)
- cambiar los sysutils.decimalSeparator en controles ad-aware.

Otra solución es heredar tú misma de TEdit, añadiendo un par de propiedades (como lo hace el DBEdit):
- DisplayFormat
- EditFormat (quizás más complicada)
- AsValue:Extended

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 16-04-2008
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
Lo que he hecho por el momento pero aún no he probado es:
* Añadir el cambio del punto del teclado decimal por una coma, tal como sale en el hilo "dichoso separador decimal"
* Modificar una rutina propia que uso en las operaciones con dinero para eliminar el separador de miles antes de nada.

Ahora toca instalarlo en los 3 sitios que me han avisado de los problemas y esperar. Os mantendré informados.
Responder Con Cita
  #6  
Antiguo 17-04-2008
Avatar de jcarteagaf
[jcarteagaf] jcarteagaf is offline
Miembro Premium
 
Registrado: abr 2006
Ubicación: La Paz, Bolivia
Posts: 651
Poder: 19
jcarteagaf Va por buen camino
Punto decimal

estare al tanto de tu avance, ya que ese tema tambien me afectara a futuro. Por favor no te olvides publicar como te fue.

Gracias de antemano.
Responder Con Cita
  #7  
Antiguo 14-05-2008
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
Por el momento ha bajado considerablemente el número de avisos de error del tipo "invalid floating point value", pero aún me llegan algunos. Estoy revisando si son por otra causa nueva o por un error.
Responder Con Cita
  #8  
Antiguo 14-05-2008
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Concepción - Chile
Posts: 2.310
Poder: 23
BlueSteel Va por buen camino
Cool

Cita:
Empezado por kuan-yiu Ver Mensaje
Por el momento ha bajado considerablemente el número de avisos de error del tipo "invalid floating point value", pero aún me llegan algunos. Estoy revisando si son por otra causa nueva o por un error.
Hola Kuan

yo he solucionado en parte ese problema con el componente JvValidateEdit de la JVC (Jedi)...

lo bueno del componente es que puedes decir que tome solo numeros.... además el mismo tiene las sgtes caracteristicas

.text
.AsCurrency
.AsFloat

por lo cual, cuando tengo un texto y debo pasarle el valor al componente solo lo uso en el .text... si tengo un valor de punto flotante (decimales) lo hago con el .AsFloat... y si el valor viene con formato de pesos (moneda)... utilizo el .AsCurrency...

Código Delphi [-]
vTot.AsCurrency := vCtd.AsFloat*vUni.AsCurrency;

Salu2
__________________
BlueSteel
Responder Con Cita
  #9  
Antiguo 15-05-2008
Avatar de Faust
Faust Faust is offline
Miembro
 
Registrado: abr 2006
Ubicación: México D.F.
Posts: 930
Poder: 19
Faust Va por buen camino
Hace poco pedí ayuda sobre TFormatSettings y como usarlo con algunas funciones como FloatToSTrF, pero solo BlueSteel me respondió y no era exactamente lo que buscaba, he hecho algunas pruebas y parece que se puede hacer esto, GetLocaleFormatSettings recupera de la configuración del sistema operativo que uses ciertas configuraciones para mostrar valores, ojalá te sirva de algo.
__________________
Herr Heins Faust
Responder Con Cita
  #10  
Antiguo 15-05-2008
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Poder: 21
mlara Va por buen camino
Lightbulb ¿Por qué no cambias la configuración regional desde tu programa?

Pues yo me evité muchos inconvenientes haciéndolo... claro, ojalá tus clientes no se enojen porque cada vez que inician tu aplicación su config. regional cambia (aunque podrías recomponerla al finalizar... digo).

Código:
SetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, '.');
SetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, ',');
SetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SMONDECIMALSEP, '.');
SetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SMONTHOUSANDSEP, ',');
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre.
Responder Con Cita
  #11  
Antiguo 15-05-2008
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
Cita:
Empezado por mlara Ver Mensaje
Pues yo me evité muchos inconvenientes haciéndolo... claro, ojalá tus clientes no se enojen porque cada vez que inician tu aplicación su config. regional cambia (aunque podrías recomponerla al finalizar... digo).

Código:
SetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, '.');
SetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, ',');
SetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SMONDECIMALSEP, '.');
SetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SMONTHOUSANDSEP, ',');
Eso no puedo hacerlo de ningún modo. Mientras usan mi programa tienen que poder usar otros que dependen de esa configuración.
Responder Con Cita
  #12  
Antiguo 15-05-2008
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
Precisamente lo que inicialmente buscaba era un componente que solucionase parte del problema BlueSteel, pero no quiero bajarme todo lo que hay en Jedi para usar sólo una cosa. También quería probar un componente que está en Torry pero justo cuando me surgió este problema la página no funcionaba.
Si alguien sabe de dónde puedo descargar algo así que me lo diga.

Gracias por la referencia Faust, pero ya tenía implementado algo así y no era suficiente, por eso hice la consulta y ahora estoy informando de los progresos, como dije que haría.
Responder Con Cita
  #13  
Antiguo 15-05-2008
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Concepción - Chile
Posts: 2.310
Poder: 23
BlueSteel Va por buen camino
Cool

Cita:
Empezado por kuan-yiu Ver Mensaje
pero no quiero bajarme todo lo que hay en Jedi para usar sólo una cosa.
Creo que la Jedi te permite seleccionar que componente deseas instalar... me parece que uno de los hilos esta.... si bien yo instalé todos... despues de buscar he encontrado algunos que me han servidor muchos... como tablas de memoria, el tab por enter, trabajar con imagenes, progresbar, y muchos otros...

Salu2
__________________
BlueSteel
Responder Con Cita
  #14  
Antiguo 18-05-2008
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Poder: 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
  #15  
Antiguo 18-05-2008
cascarrabias cascarrabias is offline
Miembro
 
Registrado: abr 2006
Posts: 103
Poder: 19
cascarrabias Va por buen camino
Lo siento...me equivoque de post, saludos!

Última edición por cascarrabias fecha: 18-05-2008 a las 11:25:28.
Responder Con Cita
  #16  
Antiguo 01-10-2008
chopin_fev chopin_fev is offline
Miembro
 
Registrado: mar 2007
Posts: 13
Poder: 0
chopin_fev Va por buen camino
Talking Perfecto.........

Mismo problema de Conf. Regional..........
Con todas las opciones que discutian llegue a la conclusion de modificar el ed.text en la propiedad keypress....solo numeros y decimales in '0'..'9' or ',' '.' y con el ThousandSeparator..... entrega si es coma o punto y con strtofloat funciona para cualquier conf.regional..........
Gracias a todos y al foro...........
Responder Con Cita
Respuesta



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 11:34:52.


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