Plutitoare Număr Punct de parsare: Există o captură Toate algoritm?

voturi
52

Una dintre părțile distractive ale programării multi-culturale este formatul numerelor.

  • Americanii folosesc 10,000.50
  • Germanii folosesc 10.000,50
  • utilizarea franceză 10 000,50

Prima mea abordare ar fi să ia șir, analiza-l înapoi, până când am întâlni un separator și de a folosi acest lucru ca separator zecimal meu. Există un defect evident cu care: 10.000 ar fi interpretat ca 10.

O altă abordare: în cazul în care șirul conține 2 caractere non-numerice diferite, utilizați ultima ca separator zecimal și aruncați ceilalți. Dacă am doar una, verificați dacă apare mai mult de o dată și aruncați-l în cazul în care o face. În cazul în care apare o singură dată, verificați dacă acesta are 3 cifre după el. Dacă da, aruncați-o, altfel folosi ca separator zecimal.

Evidentă „cea mai bună soluție“ ar fi pentru a detecta cultura sau browser-ul utilizatorului, dar care nu funcționează dacă aveți un francez folosind un en-SUA pentru Windows / Browser.

Are .NET Framework conține un anumit punct interpretor mitic magie neagră plutitoare , care este mai bună decât Double.(Try)Parse()în încercarea de a detecta automat formatul de număr?

Întrebat 01/08/2008 la 20:23
sursa de către utilizator
În alte limbi...                            


4 răspunsuri

voturi
26

Cred că tot ce se poate face în acest caz este de a lua de intrare și apoi le arăta ceea ce crezi că a însemnat. În cazul în care nu sunt de acord, arată-le formatul pe care îl așteptați și să-i să-l introduceți din nou.

Publicat 02/08/2008 la 00:17
sursa de către utilizator

voturi
26

Nu știu 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 de caractere 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 într-un fel (de exemplu, folosind HTTP anteturile) trece CultureInfo utilizatorului curent fie CultureInfo.CurrentCulture sau CultureInfo.CurrentUICulture, acestea vor funcționa bine.

Publicat 01/08/2008 la 21:02
sursa de către utilizator

voturi
11

Nu poți mulțumi pe toată lumea. Dacă introduc zece ca 10.000, iar cineva intră zece mii ca 10.000, nu te poți descurca fără o cunoaștere a culturii de intrare. Detect cultura într-un fel (browser, setarea sistemului -??? Care este cazul de utilizare ASP App internă, sau deschisă către lume), sau să ofere un exemplu de formatare așteptat, și de a folosi parserul mai indulgentă poți. Probabil ceva de genul:

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);
Publicat 01/08/2008 la 21:05
sursa de către utilizator

voturi
9

Diferența între 12.345 în franceză și engleză este un factor de 1000. Dacă furnizați o gamă de așteptat, în cazul în care max <1000 * min, puteți ghici cu ușurință.

Luați, de exemplu, înălțimea unei persoane (inclusiv sugari și copii) în mm.

Prin utilizarea unei game de 200-3000, o intrare de 1,800 sau 1,800 poate fi fără echivoc interpretate ca 1 metru și 80 de centimetri, în timp ce o intrare de 912.300 sau 912300 poate fi clar interpretată ca 91 de centimetri și 2,3 milimetri.

Publicat 02/08/2008 la 13:28
sursa de către utilizator

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