Todo aquel que haya picado algunas lineas de código en algúm momento ha tenido que leer un fichero, y esto es una verdad como un templo.
En C y C++ de toda la vida, para leer datos de un fichero se ha utilizado el «fopen» y el «fscanf», o considerado el método clásico. También «más modernos» están la serialización y los streams, pero los dejaré de lado.
Con «fscanf», si queríamos leer un número en coma flotante era algo tal que así:
fscanf(f,»%f»,&numero);
La comodidad del sistema es que era directamente complatible con «fprintf», que por norma general era con lo que se realizaba la salida al fichero. Y cómodo porque se realizaba en formato texto, con lo que era sencillo cargalo con un editor de texto y ver el contenido.
¿Todo esto a qué biene? Pués que hasta ahora la parte decimal de un número flotante estaba separada de la parte entera con un «.», como por ejemplo «3.1415».
Pero cosas que tiene la vida……. en C# no siempre es así….
Si tenemos un número decimal en un string y queremos convertirlo a una variable en coma flotante, C# nos proporciona el método «Parse». Este método está disponible para todos los tipos básicos (int, float, double, etc…), que aquí también son objetos.
Si el string a convertir es «3.1415», «float.Parse» nos devolverá un 31415.0… vaya….
Si el string a convertir es «3,1415», «float.Parse» nos devolverá un 3.1415… esto ya es lo que queremos.
Solución: se cambia el punto por una coma y listos…. ¡¡pero no!!
Resulta que si tenemos el Framework.NET en español si que funciona, pero si lo tenemos en ingles, ya no. Según el idioma cambia la cosa.
En español los decimales se separan con una coma y en ingles con un punto, por lo que el mismo programa, dependiendo como se pasen los números, los convertirá correctamente o no.
Para asegurar el tiro, la función «Parse» permite más parámetros y que nuestro programa se comporte igual sea cual sea el idioma del entorno de ejecución.
La solución buena al problema es «System.Globalization».
Este espacio de nombres es el encargado en poner un poco de orden en lo que se trata «mayormente» los distintos formatos numericos entre otras cosas.
De esta forma, si queremos que el punto sea nuestro separador decimal de toda la vida, tendremos que utilizar la localización ingles-americana de la siguiente forma:
numero = float.Parse( «3.1415», System.Globalization.NumberStyles.Float, new System.Globalization.CultureInfo( «en-US» ) );
Esto nos permite especificar de que tipo de número se trata y que tipo de conversión tiene que aplicar.
Gracias Microsoft por hacernos la vida cada vez más facil.
14 Comments
-
Gracias amigo, me has hecho un gran aporte. Estoy recién entrando al .net framework y es un alivio tener gente como vos que nos dá una mano.
-
No sabré sobre que trata el articulo, pero el header de tu página mola mil…
-
Tio me has salvado de una grande tenia el problema en el que si ingresaba 2.3 me lo pasaba a 23 y con esto que tiene en hora bueno me ha caido como anillo al dedo gracias men Dios te bendiga!!!!!!!! 🙂
-
no es necesario especificar la cultura, aparte ahi le estas dando formato de USA, con esto es suficiente :
float f = float.Parse(«123,456.789», CultureInfo.InvariantCulture);
-
ANGEL ESCOBEDO – TE FALTÓ EL FORMATO: NumberStyles.Float
EXCELENTE POST Y EXCELENTE APORTE.
valor = float.Parse(editor.EditValue.ToString(),NumberStyles.Float, CultureInfo.InvariantCulture);
«ENSEÑAR ES REAPRENDER…»
-
AH Y OBVIO, IMPORTEN PERVIAMENTE EL SYSMTEM.GLOBALIZATION….
using System.Globalization;
-
Gracias por el apunte!
-
Excelente Post.
-
Muy útil la información, muchas gracias por el aporte.
-
Gracias, me sirvo de gran ayuda.
-
Excelente, estuve buscado esta solución mucho tiempo.. gracias.!
-
De verdad Muchas Gracias, estuve buscando un buen rato algún articulo que funcione, y este es que busque tanto, Muchas pero muchas Gracias
-
Excelente aportacion
Muchas gracias funciona a las mil maravillas.