Foros Club Delphi

Foros Club Delphi (http://www.clubdelphi.com/foros/index.php)
-   Varios (http://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problemas con puntos y comas (http://www.clubdelphi.com/foros/showthread.php?t=92890)

Jcg-Guirola 05-03-2018 17:13:32

Problemas con puntos y comas
 
Hola, tengo un problemón resulta que estoy haciendo un software que realiza una serie de cálculos hidráulicos y utiliza muchos stringgrid y edit con números para realizar estos cálculos, todos los datos y resultados (de 18 forms hasta ahora) lo puedo guardar en archivos y luego cargarlos al programa en cualquier momento, el problema es que reinstalé la máquina y después de esto ahora resulta que mi pc no reconoce como real numeros con coma(6,8 por ejemplo) sino que calcula con punto(6.8) entonces cuando cargo la información a los form me los carga con coma y no con puntos y no puedo calcular, no sabía que esto podía pasar y hasta ahora en todas las pc donde lo he probado trabajan coma, lo que necesito es buscar una forma de normalizar esto para que siempre sea con coma o punto en cualquier pc(preferentemente coma) espero haberme explicado

gatosoft 05-03-2018 17:57:41

Una forma es modificar el registro global FormatSettings al inicar tu aplicaciòn para que siempre tome la coma como separador decimal...

asi:

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  FormatSettings.DecimalSeparator:=',';
end;

Pero debes tener en cuenta que estas almacenando tus datos en archivos en forma de texto (supongo).. asi que siempre deberas tener cuidado como lo lees y como lo guardas...

otra opcion es la de utilizar un registro formatsettings personalizado para hacer tus conversiones.

asumamos por ejemplo que tienes tus datos almacenados con un separador decimal igual a símbolo "Arroba".. los debes leer y trabajarlos en pantalla con el separador decimal de la màquina...

y cuando los guardes los debes guardar en otro archivo que tiene otro separado decimal, por ejemplo el signo "dolar"


Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
Var Texto: String;
    Valor: Double;
    MyFX: TformatSettings;
begin
  Texto:='45@23'; //este es el dato que lees de tu archivo 1
  MyFX.DecimalSeparator:='@';  //defines la arroba como tu separador decimal personalizado
  Valor:= StrToFloat(Texto, MyFX); //conviertes el texto (con la arroba en un numero real

  Edit1.Text:= FloatToStr(Valor); //muestras el numero en pantalla. Se verá con el separador decimal de la maquina

  Valor:= StrToFloat(Edit1.Text); // despues de modificado, conviertes el texto en numero nuevamente
  MyFX.DecimalSeparator:='$'; // defiens el separador decimal de salida
  Texto:= FloatToStr(Valor, MyFX); // conviertes el numero a texto con el nuevo separador decimal

  Edit2.Text:= texto; // guardas o muestras el numero convertido a texto

end;

Espero haber sido claro

Jcg-Guirola 05-03-2018 18:44:21

Muy Claro muchas gracias pruebo y te digo

duilioisola 06-03-2018 11:08:38

Otra explicación, también muy clara, pero en inglés.
5 Minute Snack: Reading floats with StrToFloat and TFormatSettings independent of system region settings

Quizás deberías hacer un par de funciones para leer y escribir números.
Los número que guardes en el fichero deberán tener siempre el mismo formato, ya que de lo contrario no podrás compartir ese fichero entre ordenadores con diferente configuración.
Los números que muestres deben seguir la configuración del ordenador.

Jcg-Guirola 07-03-2018 15:50:15

Disculpen la demora pero es que tuve problema con internet, al configurar el software a trabajar con ¨,¨ me fue suficiente y se que me podrán decir que debo respetar la configuración regional y utilizar ¨,¨ o ¨ .¨ pero es que debo utilizar ¨,¨ porque pienso utilizar números separados por puntos para una funcionalidad(que aún no me he decidido) que quizas le agregarle al programa.Como siempre Gran ayuda.
Se me olvidaba tube que hacer una pequeña modificación
Cita:

procedure TForm1.FormCreate(Sender: TObject);
begin
DecimalSeparator:=','; //Eliminé FormatSettings porque me daba error
end;
Y como condiciono al programa a trabajor con ¨,¨los archibos que guardo me funcionan para cualquier configuración regional

gatosoft 08-03-2018 18:26:17

Cita:

Empezado por Jcg-Guirola (Mensaje 524968)
Eliminé FormatSettings porque me daba errorl

En versiones antiguas de Delphi se usan variables globales como "DecimalSeparator"... pero embarcadero decidió poner orden (*) a ésto y encapsular dichas variables en un registro global de tipo TFormatSettings... así mismo modificó funciones como DateToStr y FloattoStr para que aceptaran un registro de éste tipo como indique anteriormente

(*) Menciono lo de poner orden, porque se sabe que el uso de variables globales... sueltas por ahí en unidades no es una buena práctica..

saludo,

AgustinOrtu 08-03-2018 18:45:31

Yo aconsejo siempre lo mismo que comenta [gatosoft]: usar un TFormatSettings propio. Tiene la gran ventaja de que si algun dia se necesita paralelizar, te ahorras el quebradero de cabeza de actualizar todas las llamadas a las funciones de formato, ya que el registro TFormatSettings global no es thread-safe.

De todos modos, considera llevarlo un poquito mas alla y crear tus propias clases/funciones para formatear, de esta manera es muy claro que se esta formateando, con que parametros, y permite modificar la configuracion de todo el programa sin tener que andar buscando referencias desparramadas por todo el codigo. Es algo que no cuesta nada de nada implementar y el dia de mañana lo agradeceras


La franja horaria es GMT +2. Ahora son las 15:20:26.

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