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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top