2011-05-29 12 views
5

Estoy leyendo números de archivos XML. Otros números son con un separador de coma (0,1111) y otros con punto (0,1111). ¿Cómo puedo analizar estos números para obtener el resultado deseado al final? Intenté usar float.Parse(reader.Value, System.Globalization.CultureInfo.InvariantCulture); pero no funciona. Por ejemplo, tengo reader.Value = "0,01119703" y se analiza como 1119703.0.C# análisis flotante de la cadena

+0

¿Cómo quieres que se analice? – soandos

+0

¿Quién te está dando datos tan extraños? Parece que el problema real es con la fuente ... – Cameron

+0

@soandos Quiero que se analice como un número flotante. Originalmente es una cadena. – user579674

Respuesta

10

No creo que sea posible trabajar con dos separadores decimales diferentes al mismo tiempo. Creo que simplemente usaría Replace() para cambiar las comas en puntos.

float.Parse(reader.Value.Replace(',', '.'), System.Globalization.CultureInfo.InvariantCulture); 
+0

El único riesgo con este enfoque sería si los números pudieran tener el formato de 1,000.00 –

+0

Eso es un poco dudoso. Si ingreso "3,456.78", el código anterior lo cambiará a "3.456.78", lo que probablemente dará como resultado un error de análisis. –

+0

Esa no es una opción. No puedo cambiar nada de la fuente. – user579674

2

¿Hay algo en los archivos XML que indique qué formato se está utilizando? No existe una forma incorporada en .NET para tener dos separadores decimales permitidos diferentes. Si no hay nada que le diga en qué formato va a estar un número, entonces siempre puede verificar si la cadena contiene un punto o una coma, y ​​crear un NumberFormatInfo con ese separador decimal. Por supuesto, esto no funcionará si alguno de los números tiene un punto o una coma como separador de miles.

+0

Son números pequeños, por lo que probablemente no haya miles de separadores. ¿Cómo puedo verificar si es una coma o un punto? ¿Debo verificar la cadena si contiene esos caracteres? – user579674

+0

No tiene que verificar nada, solo use la función Reemplazar(). Si no encuentra el personaje a reemplazar, devuelve la cadena original. Ver el código que publiqué en mi respuesta :-) – AHM

4

No estoy seguro de si esta es la mejor solución, pero quizás podría confiar en un conjunto de formatos conocidos de números "personalizados". Por ejemplo, se podría declarar dos formatos de número personalizado (ya sea desde cero o con sede fuera de un formato conocido), tales como:

private static readonly NumberFormatInfo DecimalSeparatorFormat = new NumberFormatInfo { NumberDecimalSeparator = ".", NumberGroupSeparator = "," }; 
private static readonly NumberFormatInfo CommaSeparatorFormat = new NumberFormatInfo { NumberDecimalSeparator = ",", NumberGroupSeparator = "." }; 

Y luego tratar de analizar el número a través de los formatos aceptados conocidos:

if (!Single.TryParse(unparsedValue, NumberStyles.Float, DecimalSeparatorFormat, out parsedValue) && !Single.TryParse(unparsedValue, NumberStyles.Float, CommaSeparatorFormat, out parsedValue)) 
    throw new FormatException("Number format not supported"); 

Esto supone que tienes un número finito de formatos conocidos, si tus entradas realmente pueden estar en cualquier cultura, entonces puede que tengas mala suerte para encontrar una gran solución.

La única ventaja con este enfoque es que al menos eres explícito en los formatos que puedes admitir en lugar de confiar en una simple sustitución de cadenas (que puede dar como resultado un formato no válido).