Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problemas Con Convert.tosingle En C#

Iniciado por BeRSeRKeR, 25 de Septiembre de 2004, 10:01:41 PM

« anterior - próximo »

BeRSeRKeR

 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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Grugnorr

 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 :)
hat the hells!

BeRSeRKeR

 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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

BeRSeRKeR

 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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Grugnorr

 double.Parse(string, IFormatProvider) . Culture Info  implementa IFormatProvider ;). NumberFormatInfo también, ahí tienes sólo la info que necesitas

hat the hells!

Lord Trancos 2

 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.
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

BeRSeRKeR

 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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Haddd

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

Lord Trancos 2

 A mi lo del Replace me parece una marranada.... seguro que hay una forma mejor.  :P  
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

BeRSeRKeR

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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.