Liczbę zmiennoprzecinkową parsowania: Czy istnieje złapać wszystkie algorytm?

głosy
52

Jednym z zabawnych elementów programowania wielo-kulturowego jest formaty liczb.

  • Amerykanie stosują 10,000.50
  • Niemcy używają 10.000,50
  • Francuski wykorzystanie 10 000,50

Moje pierwsze podejście byłoby podjęcie ciąg, przetworzyć go do tyłu, dopóki nie napotka separator i używać tego jako mojego separatora dziesiętnego. Jest oczywiste, że wada z: 10,000 byłyby interpretowane jako 10.

Inne podejście: jeśli ciąg zawiera 2 różne znaki non-numeryczne, użyj ostatni jako separatora dziesiętnego i usunąć pozostałe. Jeśli mam tylko jedną, sprawdź czy występuje więcej niż jeden raz i odrzucić go, jeśli to robi. Jeśli tylko pojawia się raz, sprawdź czy ma 3 cyfry po niej. Jeśli tak, należy go wyrzucić, inaczej używać go jako separator dziesiętny.

Oczywistą „najlepszym rozwiązaniem” byłoby wykryć kultury czy przeglądarka użytkownika, ale to nie działa, jeśli masz Francuz użyciem en-us Windows / Browser.

Czy .NET Framework zawierają jakąś mityczną czarna magia zmiennoprzecinkowych parser, który jest lepszy niż Double.(Try)Parse()próbując Automatyczne wykrywanie formatu liczb?

Utwórz 01/08/2008 o 20:23
źródło użytkownik
W innych językach...                            


4 odpowiedzi

głosy
26

Myślę, że najlepiej można zrobić w tym przypadku jest, aby wziąć swój wkład, a następnie pokazać im, co myślę, że miał na myśli. Jeśli nie zgadzają się, pokazać im format czekasz i przekonać ich, by wprowadzić go ponownie.

Odpowiedział 02/08/2008 o 00:17
źródło użytkownik

głosy
26

Nie wiem, po stronie ASP.NET problemu ale .NET ma dość mocny klasę: System.Globalization.CultureInfo . Można użyć następującego kodu do analizowania ciąg zawierający podwójną wartość:

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

Jeśli jakoś ASP.NET (tj nagłówków HTTP request) przechodzi CultureInfo bieżącego użytkownika do obu CultureInfo.CurrentCulture lub CultureInfo.CurrentUICulture, będą działać poprawnie.

Odpowiedział 01/08/2008 o 21:02
źródło użytkownik

głosy
11

Nie można zadowolić wszystkich. Jeśli wejdę dziesięć jako 10.000, a ktoś wchodzi dziesięć tysięcy za 10.000, nie można sobie z tym poradzić bez pewnej wiedzy o kulturze wejścia. Wykryć kultury w jakiś sposób (przeglądarka, ustawienia systemu -??? Co to jest przypadek użycia ASP app wewnętrzny, czy otwarta na świat), lub stanowić przykład oczekiwanego formatowania i używać najbardziej łagodną parser można. Prawdopodobnie coś takiego:

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);
Odpowiedział 01/08/2008 o 21:05
źródło użytkownik

głosy
9

Różnica między 12.345 w języku francuskim i angielskim jest czynnikiem 1000. Jeśli dostarczyć oczekiwany zakres gdzie max <1000 * min, można łatwo odgadnąć.

Weźmy na przykład wysokość osoby (w tym dzieci i niemowląt) w mm.

Przy użyciu zakres 200-3000, wejście od 1.800 i 1.800 można jednoznacznie należy interpretować jako 1 metr i 80 cm, podczas gdy wejście 912.300 lub 912,300 mogą być jednoznacznie interpretowane jako 91 cm i 2,3 mm.

Odpowiedział 02/08/2008 o 13:28
źródło użytkownik

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