2008-08-01 17 views
50

Una de las partes divertidas de la programación multicultural son los formatos numéricos.Análisis de número de punto flotante: ¿Hay un algoritmo Catch All?

  • estadounidenses utilizan 10,000.50
  • alemanes utilizar 10.000,50
  • uso Francés 10 000,50

Mi primer enfoque sería tomar la cadena, analizar hacia atrás, hasta que me encuentro con un separador y usar esto como mi separador decimal. Hay un error obvio con eso: 10.000 se interpretaría como 10.

Otro enfoque: si la cadena contiene 2 caracteres diferentes no numéricos, utilice el último como el separador decimal y descarte los otros. Si solo tengo uno, compruebe si ocurre más de una vez y deséchelo si lo hace. Si solo aparece una vez, verifique si tiene 3 dígitos después. Si es así, deséchelo, de lo contrario, utilícelo como separador decimal.

La "mejor solución" obvia sería detectar la cultura del usuario o el navegador, pero eso no funciona si tiene un francés que use un navegador/Windows en-US.

¿.net Framework contiene algún analizador de punto flotante de magia negra mítica que es mejor que Double.(Try)Parse() al tratar de autodetectar el formato de número?

Respuesta

25

creo que lo mejor que puede hacer en este caso es tomar su entrada y luego mostrarles lo que usted piensa que significaban. Si no están de acuerdo, muéstreles el formato que espera y haga que ingresen de nuevo.

26

No conozco el lado ASP.NET del problema, pero .NET tiene una clase bastante poderosa: System.Globalization.CultureInfo. Usted puede utilizar el código siguiente para analizar una cadena que contiene un doble valor:

double d = double.Parse("100.20", CultureInfo.CurrentCulture); 
// -- OR -- 
double d = double.Parse("100.20", CultureInfo.CurrentUICulture); 

Si ASP.NET alguna manera (es decir, utilizando encabezados de solicitud HTTP) pasa del usuario actual CultureInfo a cualquiera CultureInfo.CurrentCulture o CultureInfo.CurrentUICulture, éstos se trabaja bien.

11

No puede complacer a todos. Si ingreso diez como 10.000, y alguien ingresa diez mil como 10.000, no puede manejar eso sin algún conocimiento de la cultura de la entrada. Detecte la cultura de alguna manera (navegador, configuración del sistema: ¿cuál es el caso de uso? ¿ASP? ¿Aplicación interna o está abierto al mundo?), O brinde un ejemplo del formato esperado y use el analizador más indulgente posible. Probablemente algo como:

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture); 
9

La diferencia entre 12.345 en francés e inglés es un factor de 1000. Si proporciona un rango esperado donde max < 1000 * min, puede adivinar fácilmente.

Tome, por ejemplo, la altura de una persona (incluidos bebés y niños) en mm.

Al usar un rango de 200-3000, una entrada de 1.800 o 1.800 puede interpretarse inequívocamente como 1 metro y 80 centímetros, mientras que una entrada de 912.300 o 912.300 puede interpretarse inequívocamente como 91 centímetros y 2.3 milímetros.

Cuestiones relacionadas