2009-04-06 13 views
17

Esto me está volviendo loco. Tengo la siguiente cadena en un ASP.NET 2.0 WebForm PáginaDouble.Parse - Problema de internacionalización

string s = "0.009"; 

Bastante simple. Ahora bien, si mi cultura es española - el cual es "es-ES" - y trato de convertir la cadena doble, hago lo siguiente:

double d = Double.Parse(s, new CultureInfo("es-ES")); 

lo que cabe esperar es 0.009. En cambio, obtengo 9. Entiendo que .NET cree que es un separador de mil, que en en-US es una coma, pero ¿no debería tomar la información cultural que estoy pasando al método de análisis y aplicar el formato correcto a ¿la conversión?

Si hago

double d = 0.009D; 
string formatted = d.ToString(new CultureInfo("es-ES")); 

formato es ahora 0.009. ¿Nadie?

+1

Más detalles sobre este y muchos otros problemas con la localización me gusta en http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html –

Respuesta

20

Es es tomando la cultura que proporcionó y aplicando el formato correcto. Usted proporcionó una cadena de "0.009" y le dijo que era español ... ¡luego se queja de que lo interpretó correctamente como español! No le digas que la cadena es española cuando sabes que no es así.

Debe pasar el método Parse al cultivo de la cadena que se analiza, que en este caso sería en-US o en-Gb o InvariantCulture.

+0

sí, lo entendí todo mal. Gracias chicos por las respuestas. Fue realmente útil. –

+0

No hay problema. Siempre estoy feliz de ayudar. Lo siento si mi respuesta fue un poco aguda, no era la intención de esa manera, pero volver a leerlo ahora, se lee como si fuera un idiota correcto. –

4

Lo tienes al revés.

Cuando dice double d = Double.Parse(s, new CultureInfo("es-ES"));, le pide a .NET que analice su cadena en un doble, suponiendo que la cadena está escrita en la cultura es-ES.

En la cultura española, "." es un separador de miles, por lo que "0.009" es 9.

Al convertir usando ToString(), al final, está diciendo convertir 0.009 a una cadena usando la cultura española, por lo que usa "," como el separador decimal , y obtienes "0,009". El comportamiento es correcto.

Supongo que quiere usar Double.Parse con Invariant Culture y ToString con la cultura española, por lo que 0.009 pasa a ser 0,009.

2

Está confundiendo el análisis y el formateo. Obtiene 9 en lugar de .009 la primera vez porque toma una cadena formateada en una cultura basada en. Y la analiza utilizando una cultura basada en. Debe analizarlo utilizando la cultura con la que se creó y luego formatearlo utilizando la cultura que desee para mostrar.

3

Creo que lo está interpretando de manera incorrecta, en es-ES culture 0.009 es realmente solo una manera larga de decir 9, como el "." no es el separador decimal, por lo que si solicita que la cadena "0.009" sea analizada con la cultura es-ES, debería obtener el doble 9.0. Si le pide que analice "0,009", debe obtener un doble de 0.009.

Del mismo modo, si lo solicita al formato el doble 0.009 debe obtener la cadena "0,009" en es-ES.

1
double d = Double.Parse("0,009", 
    NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, 
    CultureInfo.CreateSpecificCulture("es-ES")); 

En la cultura es-ES "" es un seporator decimal (no "")

10

lo que funciona escritura de Jess para mí.simplemente para cualquier persona que había necesidad de probar cómo conseguir "cultural de todos": se ve este

double d = Double.Parse(myString, CultureInfo.InvariantCulture);

(primer post StackOverflow, así que sí, más bien marginal;) ​​

Cuestiones relacionadas