Vă mulțumim pentru susținere

Analiza numărului de puncte în virgulă: există un algoritm de captură totală?

Una dintre părțile distractive ale programării multiculturale este formatul numărului.

  • americanii folosesc 10.000.50
  • germanii folosesc 10.000,50
  • Franceza utilizează 10 000,50

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?

0
adăugat editat

4 răspunsuri

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.

0
adăugat

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);
0
adăugat

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.

0
adăugat

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.

0
adăugat