Analisi del numero in virgola mobile:Esiste un algoritmo Catch All?
-
08-06-2019 - |
Domanda
Uno degli aspetti divertenti della programmazione multiculturale sono i formati numerici.
- Gli americani usano 10.000,50
- I tedeschi usano 10.000,50
- I francesi usano 10 000,50
Il mio primo approccio sarebbe quello di prendere la stringa, analizzarla all'indietro finché non incontro un separatore e usarlo come separatore decimale.C'è un evidente difetto in questo:10.000 verrebbe interpretato come 10.
Un altro approccio:se la stringa contiene 2 caratteri non numerici diversi, utilizzare l'ultimo come separatore decimale e scartare gli altri.Se ne ho solo uno, controlla se si verifica più di una volta e, se lo fa, lo scarta.Se appare solo una volta, controlla se è seguito da 3 cifre.Se sì, scartalo, altrimenti usalo come separatore decimale.
L'ovvia "soluzione migliore" sarebbe quella di rilevare la cultura o il browser dell'utente, ma ciò non funziona se si ha un francese che utilizza un browser Windows/en-US.
Il .net Framework contiene un mitico parser in virgola mobile di magia nera che è migliore di Double.(Try)Parse()
nel tentativo di rilevare automaticamente il formato del numero?
Soluzione
Penso che la cosa migliore che puoi fare in questo caso sia prendere il loro contributo e poi mostrare loro cosa pensi che intendessero.Se non sono d'accordo, mostra loro il formato che ti aspetti e chiedi loro di inserirlo di nuovo.
Altri suggerimenti
Non conosco il lato ASP.NET del problema ma .NET ha una classe piuttosto potente: System.Globalization.CultureInfo.È possibile utilizzare il codice seguente per analizzare una stringa contenente un valore double:
double d = double.Parse("100.20", CultureInfo.CurrentCulture);
// -- OR --
double d = double.Parse("100.20", CultureInfo.CurrentUICulture);
Se ASP.NET in qualche modo (ad es.utilizzando le intestazioni di richiesta HTTP) passa CultureInfo dell'utente corrente a CultureInfo.CurrentCulture o CultureInfo.CurrentUICulture, funzioneranno correttamente.
Non puoi accontentare tutti.Se inserisco dieci come 10.000 e qualcuno inserisce diecimila come 10.000, non puoi gestirlo senza una certa conoscenza della cultura dell'input.Rileva la cultura in qualche modo (browser, impostazioni di sistema: qual è il caso d'uso?ASP?App interna o aperta al mondo?), oppure fornisci un esempio della formattazione prevista e utilizza il parser più indulgente possibile.Probabilmente qualcosa del tipo:
double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);
La differenza tra 12.345 in francese e inglese è un fattore 1000.Se fornisci un intervallo previsto in cui max < 1000*min, puoi facilmente indovinarlo.
Prendiamo ad esempio l'altezza di una persona (compresi neonati e bambini) in mm.
Utilizzando un intervallo compreso tra 200 e 3000, un input di 1.800 o 1.800 può essere interpretato in modo inequivocabile come 1 metro e 80 centimetri, mentre un input di 912.300 o 912.300 può essere interpretato in modo inequivocabile come 91 centimetri e 2,3 millimetri.