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.
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 :)
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.
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.
double.Parse(string, IFormatProvider) . Culture Info implementa IFormatProvider ;). NumberFormatInfo también, ahí tienes sólo la info que necesitas
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.
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.
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 ".".
A mi lo del Replace me parece una marranada.... seguro que hay una forma mejor. :P
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.