Pregunta

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

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

Mi primer enfoque sería tomar la cadena, analizarla hacia atrás hasta encontrar un separador y usarlo como separador decimal.Hay un defecto obvio en eso:10.000 se interpretaría como 10.

Otro enfoque:Si la cadena contiene 2 caracteres no numéricos diferentes, utilice el último como separador decimal y descarte los demás.Si solo tengo uno, verifico si ocurre más de una vez y lo descarto si ocurre.Si solo aparece una vez, verifique si tiene 3 dígitos después.En caso afirmativo, 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 utiliza un navegador/Windows en EE. UU.

¿Contiene .net Framework algún analizador de punto flotante de magia negra mítico que sea mejor que Double.(Try)Parse() ¿Al intentar detectar automáticamente el formato del número?

¿Fue útil?

Solución

Creo que lo mejor que puedes hacer en este caso es tomar sus opiniones y luego mostrarles lo que crees que quisieron decir.Si no están de acuerdo, muéstreles el formato que espera y pídales que lo ingresen nuevamente.

Otros consejos

No conozco el lado ASP.NET del problema, pero .NET tiene una clase bastante poderosa: Sistema.Globalización.CultureInfo.Puede utilizar 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 CultureInfo del usuario actual a CultureInfo.CurrentCulture o CultureInfo.CurrentUICulture, estos funcionarán bien.

No se 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.Detectar la cultura de alguna manera (navegador, configuración del sistema: ¿cuál es el caso de uso?¿ÁSPID?¿Aplicación interna o abierta al mundo?), o proporcione un ejemplo del formato esperado y utilice el analizador más indulgente que pueda.Probablemente algo como:

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

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

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

Al utilizar un rango de 200-3000, una entrada de 1.800 o 1.800 se puede interpretar sin ambigüedades como 1 metro y 80 centímetros, mientras que una entrada de 912.300 o 912.300 se puede interpretar sin ambigüedades como 91 centímetros y 2,3 milímetros.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top