Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: BeRSeRKeR en 25 de Septiembre de 2004, 10:01:41 PM

Título: Problemas Con Convert.tosingle En C#
Publicado por: BeRSeRKeR en 25 de Septiembre de 2004, 10:01:41 PM
 Hola.

Resulta que estoy haciendo unas cosillas en C# y tengo que guardar en un archivo valores en coma flotante pero estoy teniendo un problema. Resulta que si hago esto (simplificando las cosas) :

string s = "0.985746";
float f = Convert.ToSingle(s);
System.Console.WriteLine("Num: {0}", f);


La salida en la consola es:

985746

en vez de:

0.985746

Evidentemente eso está mal (lo mismo me ocurre si intento hacerlo con doubles). ¿Alguien sabría decirme cómo hacer que el valor se imprima bien?.

Gracias.
Título: Problemas Con Convert.tosingle En C#
Publicado por: Grugnorr en 25 de Septiembre de 2004, 10:50:40 PM
 Qué cosa más rara, prueba a poner "0,985746", con ',' en vez de '.' para separar los decimales a ver si está teniendo en cuenta el CultureInfo o algo.

Mañana le echo un ojo   O_O , ahora me piro de juerga :)
Título: Problemas Con Convert.tosingle En C#
Publicado por: BeRSeRKeR en 25 de Septiembre de 2004, 11:04:40 PM
 Si pongo ',' sí va pero claro, yo recibo los datos con '.'. Supongo que eso se podrá configurar sin necesidad de cambiar la configuración del sistema. Le echaré un ojo.

Gracias.
Título: Problemas Con Convert.tosingle En C#
Publicado por: BeRSeRKeR en 25 de Septiembre de 2004, 11:28:51 PM
 Bueno, pues como era de esperar, cambiando el CultureInfo a inglés de Estados Unidos ya funciona:

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US", false);

De todas formas, si alguien conoce alguna otra solución pues estaría bien conocerla. :)

Saludos.
Título: Problemas Con Convert.tosingle En C#
Publicado por: Grugnorr en 26 de Septiembre de 2004, 12:01:07 AM
 double.Parse(string, IFormatProvider) . Culture Info  implementa IFormatProvider ;). NumberFormatInfo también, ahí tienes sólo la info que necesitas

Título: Problemas Con Convert.tosingle En C#
Publicado por: Lord Trancos 2 en 26 de Septiembre de 2004, 03:07:36 AM
 El Dephi pasa algo similar. Para que no suceda basta esta linea;

 DecimalSeparator := '.';

Vamos, decirle que vas a usar el punto como separador decimal.
Imagino que en c# debe de haber algo similar, y no será necesario cambiar el idioma.
Título: Problemas Con Convert.tosingle En C#
Publicado por: BeRSeRKeR en 26 de Septiembre de 2004, 06:52:31 AM
 Si, la verdad es que no me hace gracia tener que cambiar la configuración regional para manejar esta situación. Así que he seguido el consejo de Grugnorr y he acabado haciendo esto:

System.Globalization.NumberFormatInfo nfInfo = new System.Globalization.NumberFormatInfo();
nfInfo.NumberDecimalSeparator = ".";
....
....
string s = "0.984365";
float f = float.Parse(s, nfInfo);
....
....
System.Console.WriteLine(f.ToString().Replace(',', '.'));


Al hacer

float f = float.Parse(s, nfInfo);

efectivamente, el número se almacena correctamente aunque con el separador decimal ',' en vez de '.'. Por eso después, a la hora de imprimir hago:

System.Console.WriteLine(f.ToString().Replace(',', '.'));

¿Qué os parece?. ¿Hay alguna manera de simplificar más las cosas o esa es la forma correcta de hacerlo?.

Gracias.
Título: Problemas Con Convert.tosingle En C#
Publicado por: Haddd en 26 de Septiembre de 2004, 11:14:30 AM
 Es la forma correcta. Unicode tiene sus ventajas, pero unos de sus inconvenientes es que dependes totalmente del idioma. Algo así pasa en Access, aunque en VBA el separador de decimales siempre es el ".".
Título: Problemas Con Convert.tosingle En C#
Publicado por: Lord Trancos 2 en 26 de Septiembre de 2004, 11:25:39 AM
 A mi lo del Replace me parece una marranada.... seguro que hay una forma mejor.  :P  
Título: Problemas Con Convert.tosingle En C#
Publicado por: BeRSeRKeR en 26 de Septiembre de 2004, 12:58:32 PM
Cita de: "Lord Trancos 2"A mi lo del Replace me parece una marranada.... seguro que hay una forma mejor.  :P
Si, a mí también. Pero por eso pregunto si hay alguna forma más simplificada. :)

Saludos.