2010-03-05 12 views
5

Cuando trato de convertir una cadena en un valor numérico con Parse o TryParse o Convert.ChangeType, no puedo propietario de de separador de miles, ya que se define en el sistema:cadena de conversión numérico y el separador de grupo

si entro:

var d = double.Parse("1,234", CultureInfo.CurrentUICulture); 

no devuelve 1234.

Si quiero usar el separador de grupo, debo escribir:

var d = double.Parse("1,234", NumberStyles.Number, CultureInfo.CurrentUICulture); 

Esta vez, el resultado es el esperado.

Pero, no quiero forzar el uso del separador de mil, quiero usarlo solo si el sistema lo especifica en la configuración de globalización. ¿Hay una manera de saber si se utiliza el separador (sé que puedo leer el separador de grupo en CultureInfo.CurrentUICulture.NumberFormat.NumberGroupSeparator)

Saludos Loic

Respuesta

0

Siempre se puede utilizar la segunda línea se utiliza

var d = double.Parse("1,234", NumberStyles.Number, CultureInfo.CurrentUICulture); 

ya que convertirá correctamente 1234 y 1.234 y debería cubrir 1.234 en sistemas que usan '.' como separador de grupo

+0

Sí, pero de hecho, quiero usar la función Convert.ChangeType para convertir una cadena genérica en un convertidor numérico y proporcionarlo como una extensión de cadena. Pero Convert.ChangeType no tiene sobrecarga con el parámetro NumberStyles. Solo permite un parámetro IFormatProvider. Y, por cierto, lo que no entiendo es por qué la configuración predeterminada de Parse no cumple con la configuración internacional de mi sistema, donde se establece el uso del separador de grupos. – Loic

2

Tener Number (que incluye AllowThousands) no se demanda una coma - simplemente permite ella. Entonces podría usar Number con o sin la coma. O use Any o AllowThousands.

Tenga en cuenta que "coma" se puede intercambiar con "separador de miles", es decir, en algunos de Eurupe puede variar (período, etc.). Si significa "la coma es miles" y utiliza una referencia cultural fija (como InvariantCulture).

+0

Estoy de acuerdo. Pero mi problema es (afirmar que la cultura es 'fr-FR' y el separador de mil es un carácter de espacio), por qué: La siguiente línea funciona: double d = (doble) Convert.ChangeType ("1 234", typeof (doble), _cultura); Mientras que la siguiente línea arroja una excepción de formato? int i = (int) Convertir.ChangeType ("1 234", typeof (int), _culture); – Loic

0

Debe analizar la entrada del usuario utilizando CurrentCulture y no CurrentUICulture.

La propiedad CurrentUICulture se refiere al idioma en el que se muestra la interfaz de usuario y CurrentCulture a la configuración regional actual especificada en Windows. De esta forma, un usuario que trabaja con una aplicación que proporciona una interfaz de usuario traducida al inglés (CurrentUICulture) puede ver/ingresar, por ejemplo, fechas y números formateados como la configuración regional que configuró en Windows (CurrentCulture).

+0

Hola, gracias por tu ayuda. Mi aplicación permite al usuario cambiar el idioma como tiempo de ejecución (proporcionamos 7 idiomas diferentes). Cambiamos CurrentUICulture y CurrentCulture cuando el usuario selecciona un idioma. Queremos que el usuario vea/ingrese las fechas y los números como el idioma seleccionado, y no como la configuración regional establecida en el sistema. – Loic

Cuestiones relacionadas