C# y FLOAT.PARSE

29

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

  • estronque
    14 septiembre, 2007 a las 9:50

    Muchas gracias funciona a las mil maravillas.

  • Marcos Di Fazio
    1 julio, 2008 a las 18:40

    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.

    Marcos
    http://www.argentinodepehuajo.blogspot.com

  • Manolito
    12 febrero, 2009 a las 18:33

    No sabré sobre que trata el articulo, pero el header de tu página mola mil…

  • antonio
    25 mayo, 2009 a las 17:48

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

  • Angel Escobedo
    13 agosto, 2009 a las 0:23

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

  • CARLOS SEGURA YOQUIGÜE
    25 noviembre, 2009 a las 16:02

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

  • CARLOS SEGURA YOQUIGÜE
    25 noviembre, 2009 a las 16:03

    AH Y OBVIO, IMPORTEN PERVIAMENTE EL SYSMTEM.GLOBALIZATION….

    using System.Globalization;

  • Polimalo Author
    25 noviembre, 2009 a las 19:17

    Gracias por el apunte!

  • Phoen
    12 diciembre, 2009 a las 14:04

    Excelente Post.

  • Lord Belial
    2 diciembre, 2010 a las 11:45

    Muy útil la información, muchas gracias por el aporte.

  • Jorge
    8 mayo, 2011 a las 12:09

    Gracias, me sirvo de gran ayuda.

  • thony
    1 junio, 2013 a las 20:40

    Excelente, estuve buscado esta solución mucho tiempo.. gracias.!

  • Nilo
    11 julio, 2013 a las 5:20

    De verdad Muchas Gracias, estuve buscando un buen rato algún articulo que funcione, y este es que busque tanto, Muchas pero muchas Gracias

  • Carlos
    9 febrero, 2016 a las 14:33

    Excelente aportacion