2008-08-01 29 views
50

Jedną z zabawnych części programowania wielokulturowego są formaty liczbowe.Analiza liczby zmiennoprzecinkowej: Czy istnieje algorytm Catch All?

  • Amerykanie użyć 10,000.50
  • Niemcom wykorzystać 10.000,50
  • Francuzi używają 10 000,50

Moje pierwsze podejście byłoby podjęcie ciąg, przetworzyć go do tyłu, aż napotkasz separator i używaj tego jako separatora dziesiętnego. Występuje w tym oczywisty błąd: 10.000 będzie interpretowane jako 10.

Inne podejście: jeśli ciąg zawiera 2 różne nie-numeryczne znaki, użyj ostatniego jako separatora dziesiętnego i odrzuć pozostałe. Jeśli mam tylko jedną, sprawdź, czy występuje więcej niż raz i odrzuć ją, jeśli tak się stanie. Jeśli pojawi się tylko raz, sprawdź, czy ma po nim 3 cyfry. Jeśli tak, odrzuć go, w przeciwnym razie użyj go jako separatora dziesiętnego.

Oczywistym "najlepszym rozwiązaniem" byłoby wykrycie kultury użytkownika lub przeglądarki, ale to nie działa, jeśli masz Francuza za pomocą en-US Windows/Browser.

Czy .NET Framework zawiera jakiś mityczny analizator zmiennoprzecinkowy z czarną magią, który jest lepszy niż Double.(Try)Parse() w próbie automatycznego wykrycia formatu liczbowego?

Odpowiedz

25

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 się nie zgadzają, pokaż im oczekiwany format i zachęć ich do ponownego wejścia.

26

Nie znam strony ASP.NET problemu, ale .NET ma dość potężną 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 (czyli przy użyciu nagłówków HTTP request) przechodzi bieżącego użytkownika CultureInfo albo CultureInfo.CurrentCulture lub CultureInfo.CurrentUICulture, będą dobrze pracować.

11

Nie możesz zadowolić wszystkich. Jeśli wprowadzę dziesięć jako 10.000, a ktoś wejdzie w dziesięć tysięcy jako 10.000, nie poradzisz sobie z tym bez znajomości kultury danych wejściowych. Wykryj kulturę w pewien sposób (przeglądarka, ustawienia systemu - co to jest przypadek użycia? ASP? Aplikacja wewnętrzna lub otwarta na świat?) Lub podaj przykład oczekiwanego formatowania i użyj najłatwiejszego parsera. Prawdopodobnie coś jak:

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture); 
9

Różnica między 12.345 w języku francuskim i angielskim to współczynnik 1000. Jeśli podasz spodziewany zakres, w którym maks. < 1000 * min, możesz łatwo odgadnąć.

Weźmy na przykład wzrost osoby (w tym dzieci i dzieci) w mm.

Korzystając z zakresu od 200 do 3000, dane wejściowe o wartości 1,800 lub 1,800 można jednoznacznie interpretować jako 1 metr i 80 centymetrów, podczas gdy dane wejściowe o wartości 912.300 lub 912 300 można jednoznacznie zinterpretować jako 91 centymetrów i 2,3 milimetra.