Aquí podría ser tu PUBLICIDAD


Análisis de número de punto flotante: ¿Hay un algoritmo Catch All?

votos
52

Una de las partes divertidas de la programación multicultural son los formatos numéricos.

  • Los estadounidenses usan 10,000.50
  • Los alemanes usan 10.000,50
  • Uso francés 10 000,50

Mi primer enfoque sería tomar la cadena, analizarla hacia atrás, hasta que encuentre un separador y usar esto como mi separador decimal. Hay un defecto 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 usa un navegador / Windows en-EE. UU.

¿El .NET Framework contiene algún analizador de puntos flotantes mítico de magia negra que es mejor que Double.(Try)Parse()intentar autodetectar el formato de número?

Publicado el 01/08/2008 a las 20:23
fuente por usuario Michael Stum
En otros idiomas...        العربية       

4 respuestas

votos
26

Creo que lo mejor que puedes hacer en este caso es tomar su opinión y luego mostrarles lo que piensas que significan. Si no están de acuerdo, muéstreles el formato que espera y haga que ingresen de nuevo.

Respondida el 02/08/2008 a las 12:17
fuente por usuario Ryan Fox


Aquí podría ser tu PUBLICIDAD


votos
26

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

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

Si ASP.NET de alguna manera (es decir, usando encabezados de Solicitud HTTP) pasa el CultureInfo del usuario actual a CultureInfo.CurrentCulture o CultureInfo.CurrentUICulture, estos funcionarán bien.

Respondida el 01/08/2008 a las 09:02
fuente por usuario huseyint

votos
11

No puedes 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 así como:

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);
Respondida el 01/08/2008 a las 09:05
fuente por usuario Chris Marasti-Georg

votos
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.

Tomemos, 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.

Respondida el 02/08/2008 a las 01:28
fuente por usuario Michiel de Mare