2009-06-18 12 views
10

Tengo un archivo de texto, que utilizo para ingresar información en mi aplicación. El problema es que algunos valores son flotantes ya veces son nulos, por lo que obtener una excepciónfloat.Parse() no funciona como yo quería

 var s = "0.0"; 
     var f = float.Parse(s); 

El código anterior arroja una excepción en la línea 2 "La cadena de entrada no estaba en el formato correcto."

Creo que la solución serían las sobrecargas avanzadas de float.Parse, que incluyen IFormatProvider como parámetro, pero aún no sé nada al respecto.

¿Cómo analizo "0.0"?

+0

He intentado descifrar su código y puedo analizar bien el valor. –

+3

Este código depende del cultivo (es decir, depende de la configuración regional). Entonces, algunos de nosotros no veremos este comportamiento. – inazaruk

Respuesta

22

Símbolo de punto "." no se usa como separador (esto depende de la configuración de Cultura). Así que si quieres estar absolutamente seguro de que punto se analiza correctamente tiene que escribir algo como esto:

CultureInfo ci = (CultureInfo)CultureInfo.CurrentCulture.Clone(); 
ci.NumberFormat.CurrencyDecimalSeparator = "."; 
avarage = double.Parse("0.0",NumberStyles.Any,ci); 
+0

Lo siento mucho por la respuesta tardía (acepté su respuesta ahora), pero he estado ocupado. Gracias por su respuesta, hace lo que necesitaba. Realmente lo aprecio. –

+2

CultureInfo.InvariantCulture es mejor. (vea abajo) –

2

Acabo de probar esto y no arrojó ninguna excepción.

¿Su formato numérico utiliza una coma decimal en lugar de un punto decimal? ¿Has probado:

var s = "0,0"; 
var f = float.Parse(s); 

Tras haber solicitado a esta He intentado con la coma esperando para conseguir una excepción, pero no lo hicieron. Entonces esta podría no ser la respuesta.

+0

La excepción se puede producir con la configuración regional correcta, por ejemplo, inglés. – Akku

+0

@ Akku - No recuerdo la prueba exacta que hice (publiqué esta respuesta hace 2 años y medio), pero conozco las configuraciones regionales y cómo afectan el análisis sintáctico de los números. Estaba sugiriendo al usuario que * his * locale se estableció en uno que esperaba comas decimales en lugar de puntos decimales. – ChrisF

+0

Esta [nueva pregunta] (http://stackoverflow.com/questions/8883801/double-tryparse-ignores-numberformatinfo-numbergroupsizes) podría explicar por qué obtuve un resultado en lugar de una excepción. – ChrisF

2

O, simplemente puede comprobar si el texto de entrada no es nulo o está vacío.

Además, tenga cuidado, porque en algunos países, el "." (punto) que separa los números del flotador es "," (coma)

+0

En realidad, es un punto y no funciona. Cuando lo cambié a una coma, funcionó. Puede que tenga que cambiar todo el archivo. –

+1

No, tu no. Puede configurar el punto para ser reconocido como separador personalizado. – inazaruk

+0

Interesante, pero ¿cómo? –

6

puede comprobar si hay cadena nula o vacía en primer lugar.

También puede usar una de las sobrecargas de Parse (o incluso usar TryParse) para proporcionar un control más específico.

E.g. para comprobar el uso de la cultura invarient, para evitar variaciones separador decimal con datos visibles no usuarios (por ejemplo, de comunicaciones A2A):

float SafeParse(string input) { 
    if (String.IsNullOrEmpty(input)) { throw new ArgumentNullException("input"); } 

    float res; 
    if (Single.TryParse(input, NumberStyles.Float, CultureInfo.InvariantCulture, out res)) { 
    return res; 
    } 

    return 0.0f; // Or perhaps throw your own exception type 
} 
3

siguiente funciona para mí:

string stringVal = "0.0"; 
float floatVal = float.Parse(stringVal , CultureInfo.InvariantCulture.NumberFormat); 

el caso inverso (funciona para todos los países):

float floatVal = 0.0f; 
string stringVal = floatVal.ToString("F1", new CultureInfo("en-US").NumberFormat); 
Cuestiones relacionadas