Lebegőpontos szám elemzés: Van fogás minden algoritmus?

szavazat
52

Az egyik szórakoztató rész multi-kulturális programozás szám formátumban.

  • Amerikaiak 10,000.50
  • Németek használja 10.000,50
  • Francia használat 10 000,50

Az első megközelítés az lenne, ha a húr, feldolgozni, hogy hátrafelé, amíg nem találkozik egy elválasztó, és használja ezt az én tizedeselválasztóként. Van egy nyilvánvaló hiba az, hogy: 10.000 lenne értelmezhető 10.

Egy másik megközelítés: ha a szöveg tartalmaz 2 különböző nem numerikus karaktereket használja az utolsó a tizedes elválasztó és dobja ki a többiek. Ha csak egy, akkor esetleg egynél többször fordul elő, és dobja rá, ha nem. Ha csak egyszer jelenik meg, ellenőrizze, hogy van 3 számjegy után. Ha igen, akkor dobja ki, egyébként ez a decimális szeparátor.

A nyilvánvaló „legjobb megoldás” lenne felismerni a Felhasználó kultúra vagy a böngésző, de ez nem működik, ha van egy francia használó Windows-en-US / böngésző.

Vajon a .NET-keretrendszer tartalmaz valamilyen mitikus fekete mágia lebegőpontos értelmező, ami jobb, mint Double.(Try)Parse()próbál automatikusan érzékeli a szám formátum?

A kérdést 01/08/2008 20:23
a forrás felhasználó
Más nyelveken...                            


4 válasz

szavazat
26

Nem tudom, hogy az ASP.NET oldalon a probléma, de a .NET van egy elég erős osztály: System.Globalization.CultureInfo . Használhatja a következő kódot értelmezni egy húr, amely a dupla érték:

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

Ha ASP.NET valahogy (azaz a HTTP kérés fejlécét) átadja aktuális felhasználó CultureInfo bármelyik CultureInfo.CurrentCulture vagy CultureInfo.CurrentUICulture, ezek jól működik.

Válaszolt 01/08/2008 21:02
a forrás felhasználó

szavazat
11

Nem lehet mindenkinek a kedvére tenni. Ha én meg tíz, mint 10.000, és valaki belép tízezer mint 10.000, akkor nem tudja kezelni, hogy nem ismered a kultúra a bemenet. Érzékeli a kultúra valahogy (böngésző, a rendszer beállítása - mi haszna esetében? ASP? Belső alkalmazás vagy a világra nyitott?), Vagy példát ad a várható formázás, és használja a legenyhébb értelmező tudsz. Valószínűleg valami hasonló:

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);
Válaszolt 01/08/2008 21:05
a forrás felhasználó

szavazat
26

Azt hiszem, a legjobb, amit tehetünk ebben az esetben az, hogy az általuk betáplált és majd megmutatjuk, mit gondol jelentenek. Ha nem értenek egyet, mutassa meg nekik a méret vársz, és kérni őket, hogy adja meg újra.

Válaszolt 02/08/2008 00:17
a forrás felhasználó

szavazat
9

A különbség 12,345 angol és francia nyelven is olyan tényező, 1000. Ha a kínálat várható tartomány, ahol max <1000 * min, könnyen kitalálható.

Vegyük például a magassága egy személy (beleértve a csecsemőket és a gyermekeket is) mm-ben.

Segítségével egy sor 200-3000, egyik bemenetére 1.800 vagy 1800 lehet egyértelműen értelmezhető 1 méter és 80 centiméter, míg a bemeneti a 912,300 vagy 912.300 lehet egyértelműen értelmezhető 91 centiméter és 2,3 milliméter.

Válaszolt 02/08/2008 13:28
a forrás felhasználó

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