c# - programacion - punto flotante informatica
Análisis de número de coma flotante: ¿hay un algoritmo de capturar todo? (4)
Una de las partes divertidas de la programación multicultural son los formatos de números.
- 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ían como 10.
Otro enfoque: si la cadena contiene 2 caracteres no numéricos diferentes, use el último como separador decimal y descarte los otros. Si solo tengo uno, verifique si ocurre más de una vez y, si lo tiene, lo descarta. Si solo aparece una vez, verifique si tiene 3 dígitos después. En caso afirmativo, deséchelo, de lo contrario, úselo como separador decimal.
La "mejor solución" obvia sería detectar la cultura o el navegador del usuario, pero eso no funciona si tiene un francés que utiliza un navegador / Windows en EE. UU.
¿El .net Framework contiene algún analizador mítico de coma flotante de magia negra que es mejor que
Double.(Try)Parse()
al intentar detectar automáticamente el formato de número?
Creo que lo mejor que puedes hacer en este caso es tomar su opinión y luego mostrarles lo que crees que querían decir. Si no están de acuerdo, muéstreles el formato que espera y pídales que lo ingresen nuevamente.
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 se puede interpretar inequívocamente como 1 metro y 80 centímetros, mientras que una entrada de 912.300 o 912.300 se puede interpretar inequívocamente como 91 centímetros y 2.3 milímetros.
No conozco el lado ASP.NET del problema, 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 CultureInfo del usuario actual a CultureInfo.CurrentCulture o CultureInfo.CurrentUICulture, estos funcionarán bien.
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 abierta al mundo?), O proporcione un ejemplo del formato esperado y use el analizador más indulgente que pueda. Probablemente algo como:
double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);