Floating Point Number rozebrat: Existuje nějaký úlovek All algoritmus?

hlasů
52

Jeden z legrace částí multi-kulturních programů je číselné formáty.

  • Američané používají 10,000.50
  • Němci používají 10.000,50
  • Francouzsky použití 10 000,50

Moje první přístup by bylo vzít řetězec, analyzovat ji dozadu, až se setkám oddělovač a používat to jako můj oddělovač desetinných míst. Tam je zřejmá chyba s tím: 10.000 by být interpretován jako 10.

Jiný přístup: v případě, že řetězec obsahuje 2 různé non-číselné znaky, použít poslední jako oddělovač desetinných míst a vyřadit ostatní. Mám-li pouze jeden, zkontrolujte, zda se vyskytuje více než jednou a vyhoďte ji, pokud to dělá. Pokud se objeví pouze jednou, zkontrolujte, zda má 3 číslice po něm. Pokud ano, zlikvidujte ji, jinak jej použít jako oddělovač desetinných míst.

Zřejmým „nejlepší řešení“ by bylo odhalit kulturu nebo prohlížeč uživatele, ale to nefunguje, pokud máte Francouze použitím en-USA Windows / Browser.

Má NET Framework obsahuje některé mytické černá magie s plovoucí desetinnou čárkou parser, který je lepší než Double.(Try)Parse()ve snaze Auto Detect-formát čísla?

Položena 01/08/2008 v 20:23
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
26

Myslím, že nejlepší, co můžete udělat v tomto případě je, aby se jejich vstup a pak jim ukázat, co si myslíte, že měl na mysli. Nedohodnou-li se ukázat jim formát jste očekával, a přimět je, aby jej znovu zadávat.

Odpovězeno 02/08/2008 v 00:17
zdroj uživatelem

hlasů
26

Nevím stranu ASP.NET problému, ale NET má docela silný třídu: System.Globalization.CultureInfo . Můžete použít následující kód k analýze řetězec obsahující dvojí hodnotu:

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

Pokud ASP.NET nějakým způsobem (tj pomocí požadavku HTTP hlavičky) prochází aktuálního uživatele CultureInfo na obou CultureInfo.CurrentCulture nebo CultureInfo.CurrentUICulture, to bude fungovat dobře.

Odpovězeno 01/08/2008 v 21:02
zdroj uživatelem

hlasů
11

Nemůžete zavděčit všem. Mám-li zadat deset as 10.000, a někdo vstoupí deset tisíc za 10.000, nelze zvládnout bez nějaké znalosti kultury vstupu. Odhalit kulturu nějak (prohlížeč, nastavení systému? -? Čemu je případ ASP interní aplikace nebo otevřené světu), nebo poskytnout příklad očekávaného formátování a používat nejmírnější analyzátor můžete. Pravděpodobně něco jako:

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);
Odpovězeno 01/08/2008 v 21:05
zdroj uživatelem

hlasů
9

ve francouzštině a angličtině Rozdíl mezi 12.345 je faktorem 1000. Pokud zadáte očekávaný rozsah, kde max <1000 * min, můžete snadno odhadnout.

Vezměte si například výšku osoby (včetně kojenců a dětí) v mm.

Použitím rozsah 200-3000, vstup na 1.800 a 1.800 lze jednoznačně být vykládán tak, 1 metr a 80 centimetrů, zatímco vstup z 912.300 nebo 912,300 mohou být jednoznačně interpretován jako 91 cm a 2,3 milimetrů.

Odpovězeno 02/08/2008 v 13:28
zdroj uživatelem

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