Numero in virgola mobile di analisi: C'è un fermo tutto algoritmo?

voti
52

Una delle parti più divertenti di programmazione multi-culturale è formati numerici.

  • Gli americani usano 10,000.50
  • Tedeschi usano 10.000,50
  • uso Francese 10 000,50

Il mio primo approccio sarebbe quello di prendere la corda, analizzarlo all'indietro, fino a quando ho incontrato un separatore e utilizzare questo come il mio separatore decimale. C'è un evidente difetto con quella: 10.000 verrebbe interpretato come 10.

Un altro approccio: se la stringa contiene 2 caratteri non numerici differenti, utilizzare l'ultimo come separatore decimale e scartare gli altri. Se ho solo una, controllare se si verifica più di una volta e disfarsene se lo fa. Se appare solo una volta, controlla se ha 3 cifre dopo di esso. Se sì, scartarla, altrimenti usarlo come separatore decimale.

La soluzione migliore ovvia sarebbe quella di rilevare la cultura o del browser dell'utente, ma che non funziona se si dispone di un francese con un en-US di Windows / Browser.

Ha il framework .NET contengono alcuni mitico parser punto magia nera che galleggia che è meglio che Double.(Try)Parse()nel tentativo di rilevare automaticamente il formato numerico?

È pubblicato 01/08/2008 alle 20:23
fonte dall'utente
In altre lingue...                            


4 risposte

voti
26

Credo che la migliore che si può fare in questo caso è quello di prendere il loro contributo e poi mostrare loro ciò che si pensa che significava. Se non sono d'accordo, mostrare loro il formato ti aspetti e farli entrare di nuovo.

Risposto il 02/08/2008 a 00:17
fonte dall'utente

voti
26

Non so il lato ASP.NET del problema, ma ha una classe .NET piuttosto potente: System.Globalization.CultureInfo . È possibile utilizzare il seguente codice per analizzare una stringa contenente un doppio valore:

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

Se ASP.NET in qualche modo (vale a dire utilizzando richiesta HTTP header) passa CultureInfo dell'utente corrente a uno o CultureInfo.CurrentCulture CultureInfo.CurrentUICulture, questo non funziona bene.

Risposto il 01/08/2008 a 21:02
fonte dall'utente

voti
11

Non si può piacere a tutti. Se entro dieci come 10.000, e qualcuno entra diecimila come 10.000, non è possibile gestire che senza una certa conoscenza della cultura dell'ingresso. Rilevare la cultura in qualche modo (browser, impostazioni di sistema -??? Che cosa è il caso d'uso ASP app interno, o aperto al mondo), o di fornire un esempio della formattazione atteso, e utilizzare il parser più indulgente è possibile. Probabilmente qualcosa di simile:

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);
Risposto il 01/08/2008 a 21:05
fonte dall'utente

voti
9

La differenza tra i 12.345 in francese e in inglese è un fattore di 1000. Se si fornisce un range previsto entro il numero massimo <1000 * min, si può facilmente intuire.

Prendiamo ad esempio l'altezza di una persona (compresi i neonati e bambini) in mm.

Utilizzando un intervallo di 200-3000, un ingresso di 1.800 o 1.800 può essere interpretata in modo inequivocabile di 1 metro e 80 centimetri, mentre un ingresso di 912,300 o 912.300 può inequivocabilmente essere interpretato come 91 centimetri e 2,3 millimetri.

Risposto il 02/08/2008 a 13:28
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more