Una dintre părțile distractive ale programării multiculturale este formatul numărului.
Prima mea abordare ar fi să iau coarda, să o analizez înapoi, până când am întâlnit un separator și aș folosi acest lucru ca separator zecimal. Există o eroare evidentă: 10.000 vor fi interpretate ca 10.
O altă abordare: dacă șirul conține 2 caractere diferite, nu utilizați ultima ca separator zecimal și aruncați celelalte. Dacă am doar una, verificați dacă apare mai mult de o dată și aruncați-o dacă este cazul. Dacă apare o singură dată, verificați dacă are 3 cifre după aceasta. Dacă da, aruncați-o, altfel utilizați-o ca separator zecimal.
Evident, "cea mai bună soluție" ar fi detectarea culturii utilizatorului sau a browserului, dar acest lucru nu funcționează dacă aveți un francez care utilizează un Windows / Browser en-US.
Cadrul .net conține un parser mitic de magie neagră, care este mai bun decât parola Double (Try) Parse ()
în încercarea de a detecta automat formatul numărului?
Nu cunosc partea ASP.NET a problemei, dar .NET are o clasă destul de puternică: System.Globalization.CultureInfo . Puteți utiliza următorul cod pentru a analiza un șir care conține o valoare dublă:
double d = double.Parse("100.20", CultureInfo.CurrentCulture);
// -- OR --
double d = double.Parse("100.20", CultureInfo.CurrentUICulture);
În cazul în care ASP.NET cumva (adică folosind antetele de solicitare HTTP) trece cultura curentă a utilizatorului CultureInfo fie către CultureInfo.CurrentCulture sau CultureInfo.CurrentUICulture, acestea vor funcționa bine.
Nu poți mulțumi pe toată lumea. Dacă intru în zece la 10.000, iar cineva intră în zece mii la 10.000, nu poți să o faci fără o cunoaștere a culturii inputului. Detectați cultura într-un fel (browser, setare sistem - ce este cazul de utilizare? ASP? Aplicație internă sau deschisă pentru lume?), Sau oferiți un exemplu de formatare așteptată și utilizați parserul cel mai lenient puteți. Probabil ceva de genul:
double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);
Cred că cel mai bun lucru pe care îl puteți face în acest caz este de a lua contribuția lor și apoi să le arătați ceea ce credeți că au însemnat. Dacă acestea nu sunt de acord, arătați-le formatul pe care îl așteptați și le puteți reintroduce.
The difference between 12.345 in French and English is a factor of 1000. If you supply an expected range where max < 1000*min, you can easily guess.
Luați, de exemplu, înălțimea unei persoane (inclusiv a copiilor și a copiilor) în mm.
Prin utilizarea unui interval de 200-3000, o intrare de 1.800 sau 1.800 poate fi interpretată fără echivoc ca 1 metru și 80 de centimetri, în timp ce o intrare de 912.300 sau 912.300 poate fi interpretată fără echivoc ca 91 centimetri și 2.3 milimetri.