PDA

Ver la Versión Completa : Problemas con puntos y comas


Jcg-Guirola
05-03-2018, 17:13:32
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:

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"


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 (https://flixengineering.com/archives/612)

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

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
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