Ir al contenido


Foto

[RESUELTO] cadena a float


  • Por favor identifícate para responder
10 respuestas en este tema

#1 jc

jc

    Member

  • Miembros
  • PipPip
  • 40 mensajes
  • LocationMojácar, Almería, España

Escrito 21 abril 2011 - 05:26

                                                                                      Hola

Viendo lo que hablais sobre los float en el post Cálculo tipo currency en un dbedit (no hay forma ¡¡¡¡buuuuaaaaa!!!!!), os comento que también ando liado con las conversiones de cadenas a float.

En mi caso tenía hecho un programa en el que uso las funciones StrToFloat, FloatToStr, FormatFloat y FloatToStrF y me funcionaba perfecto.

Recientemente actualicé a la versión 0.9.30 y ahí empezaron los lios. Le hice unos cambios a la interfaz del programa, poca cosa, solo reubicar algunos controles, vamos, no toqué nada el código, recompilo y sin problemas. Pero a la hora de ejecutarlo me salen excepciones por todas partes del tipo "5.0 no es en float válido".

Me di cuenta que el problema era el separador decimal, yo usaba el punto (.) y la nueva versión parece que me exige la coma (,), cambié todo el código para usar la coma y volvió a funcionar todo.

Mis problemas no terminaron ahí, ya que tenía el programa diseñado de forma que podía introducir todos los datos con el teclado numérico, pero ahí no hay coma. Así que me vi obligado a volverlo a modificar todo y para solucionar los problemas con el separador decimal me hice unas funciones que reciben una cadena y la devuelven cambiando el punto por coma y otra al revés.

Todo esto me pasó con la versión de windows, en linux aun no actualicé a la 0.9.30. En cuanto pasen las fiestas actualizaré a una versión snapshot a ver que tal.

Saludos
                           
  • 0

#2 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 21 abril 2011 - 08:46

podrias poner algo del codigo que utilizas. De donde sacas los datos y como los conviertes, para asi poder tener una idea de cual puede ser el problema. En mi version 0.9.31 no tengo ningun problema, asi que seria bueno saber si es un bug de la version 0.9.30
  • 0

#3 jc

jc

    Member

  • Miembros
  • PipPip
  • 40 mensajes
  • LocationMojácar, Almería, España

Escrito 21 abril 2011 - 03:21

Hola

Hice un pequeño ejemplo:



delphi
  1.     num := 50.50;
  2.     cad_num := FloatToStr(num);
  3.     write('Numero a cadena: ');
  4.     writeln(cad_num);
  5.  
  6.     cad_num := '10.10';
  7.     write('Cadena 10.10 a numero: ');
  8.     num := StrToFloat(cad_num);
  9.     writeln(cad_num);



Compilando con windows y la versión 0.9.30 recién instalada, me muestra la siguiente salida:



delphi
  1. Numero a cadena: 50,5
  2. Cadena 10.10 a numero: exception at 0041D676:
  3. "10.10" is an invalid float.



Como se ve en la primera línea, usa el carácter coma (,) como separador decimal y al tratar de convertir una cadena con el separador decimal punto (.) causa la excepción.

El ejemplo anterior en la versión 0.9.28.2 funciona sin problemas, pero si cambio la línea que se asigna la cadena y cambio '10.10' por '10,10' el resultado es el siguiente:



delphi
  1. Numero a cadena: 50.5
  2. Cadena 10,10 a numero: exception at 08082BE6:
  3. "10,10" is an invalid float.



Como se ve, el problema es el carácter separador decimal, la versión 0.9.30 usa la coma, en cambio, en la versión 0.9.28.2 usa un punto.

No sé si será un error de la versión 0.9.30, de todas formas, cuando pasen estas fiestas probaré la 0.9.31 a ver si se solucionó.

Saludos
  • 0

#4 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

Escrito 21 abril 2011 - 05:36

Hola,

Yo tengo la versión 0.9.30 en Suse Linux y en Ubuntu linux y me pasa lo mismo con los float y el punto como separador de decimal. Lo único es que como soy novato en Lazarus no sabía que antes funcionaba con el punto como decimal y hice las pruebas con la coma en lugar de con el punto, pensando que ya me encargaría más adelante del formateo.

Habrá que ver si es un bug. ¿Alguien que tenga la 0.9.31 en Linux puede hacer la prueba y decirnos algo?

Saludos

Marc Miralles
  • 0

#5 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 22 abril 2011 - 12:08

¿ Porqué no haces un pequeño proyecto, con un único formulario, que muestre el problema y lo cuelgas para que lo podamos probar en nuestras máquinas ?.

Salutacions.
  • 0

#6 jc

jc

    Member

  • Miembros
  • PipPip
  • 40 mensajes
  • LocationMojácar, Almería, España

Escrito 22 abril 2011 - 02:13

Hola

Armé un pequeño ejemplo, un formulario en el que se pide un número decimal en un campo TMaskEdit y que al pulsar INTO se convierte a número y después otra vez a cadena y se muestra en una etiqueta de texto.

Como indico en el propio ejemplo, si en la máscara de edición uso el carácter punto como separador decimal, me funciona bien en la versión 0.9.28.2, pero me da excepción en la 0.9.30.

Y si uso una coma ocurre justo al revés.

Un saludo

Archivos adjuntos


  • 0

#7 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

Escrito 22 abril 2011 - 02:36

¡¡¡¡¡Justo lo mismo que me pasa a mi!!!!!, he probado tu ejemplo y el error lo tengo ya grabado en los ojos, es decir, lo veo hasta si los cierro  :grin:


Saludos

Marc Miralles
  • 0

#8 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 22 abril 2011 - 06:09

Pues cambiando la coma por un punto en la version 0.9.31 para windows, me funciona bien.  Voy a probar en la version que tengo para ubuntu y les aviso como sale todo.

Imagen Enviada
  • 0

#9 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 23 abril 2011 - 03:06

Aunque no debería ser necesario, prueba a definir correctamente la propiedad DecimalSeparator, al arrancar tu aplicación (en Delphi necesitas el SysUtils en los Uses).

DecimalSeparator := ',';

Saludos.
  • 0

#10 jc

jc

    Member

  • Miembros
  • PipPip
  • 40 mensajes
  • LocationMojácar, Almería, España

Escrito 24 abril 2011 - 04:22

Aunque no debería ser necesario, prueba a definir correctamente la propiedad DecimalSeparator, al arrancar tu aplicación (en Delphi necesitas el SysUtils en los Uses).

DecimalSeparator := ',';

Saludos.


Ahí le diste Marc, usando DecimalSeparator puedo usar cualquier carácter como separador, estuve probando y me admite y funciona sin problemas incluso con letras.

Lo que me tenía desconccertado es que por defecto, sin poner nada, el uso de diferentes separadores en las diferentes versiones de Lazarus.

Marco como resuelto, aunque me queda la duda de porqué cada versión usa por defecto un separador diferente.

Saludos
  • 0

#11 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 24 abril 2011 - 08:51

Lo que me tenía desconccertado es que por defecto, sin poner nada, el uso de diferentes separadores en las diferentes versiones de Lazarus.

Marco como resuelto, aunque me queda la duda de porqué cada versión usa por defecto un separador diferente.


Se supone que tu aplicación tiene que inicializar por si sola esa variable, en función de la configuración regional del sistema operativo. Y es que Lazarus o Delphi no tienen un valor por defecto para ella, en un equipo en castellano tienen que coger la coma como separador decimal, y en un equipo americano, el punto.

Esto tiene pinta de que ese sistema no tiene bien definida la configuración regional, o bien esa versión de Lazarus tiene algún bug que le impide leer bien esa configuración. Probablemente es esto último.

Saludos.
  • 0




IP.Board spam blocked by CleanTalk.