c# - resource - Gleitkommazahl-Parsing: Gibt es einen Catch-All-Algorithmus?




mvc localization (3)

Du kannst es nicht jedem recht machen. Wenn ich zehn als 10.000 eintrage und jemand zehntausend als 10.000 eingibt, können Sie das nicht ohne etwas Wissen über die Kultur der Eingabe handhaben. Erkennen Sie die Kultur irgendwie (Browser, Systemeinstellung - was ist der Anwendungsfall? ASP? Interne App oder offen für die Welt?), Oder geben Sie ein Beispiel für die erwartete Formatierung an und verwenden Sie den nachsichtigsten Parser, den Sie haben können. Wahrscheinlich so etwas wie:

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

Einer der unterhaltsamen Teile der multikulturellen Programmierung sind Zahlenformate.

  • Amerikaner verwenden 10.000,50
  • Deutsche nutzen 10.000,50
  • Französisch verwenden 10 000,50

Mein erster Ansatz wäre, die Zeichenfolge zu nehmen, sie rückwärts zu analysieren, bis ich auf ein Trennzeichen stoße und dieses als Dezimaltrennzeichen verwende. Darin liegt ein offensichtlicher Fehler: 10.000 würden als 10 interpretiert.

Ein anderer Ansatz: Wenn die Zeichenfolge zwei verschiedene nichtnumerische Zeichen enthält, verwenden Sie die letzte als Dezimaltrennzeichen und verwerfen Sie die anderen Zeichen. Wenn ich nur eins habe, prüfe, ob es mehr als einmal vorkommt, und verwerfe es, wenn es passiert. Wenn es nur einmal erscheint, überprüfen Sie, ob es 3 Stellen nach ihm hat. Wenn ja, verwerfen Sie es, andernfalls verwenden Sie es als Dezimaltrennzeichen.

Die offensichtliche "beste Lösung" wäre, die Kultur oder den Browser des Nutzers zu erkennen, aber das funktioniert nicht, wenn Sie einen Franzosen haben, der einen Windows / Browser in den USA benutzt.

Enthält das .net Framework einen mythischen Floating Point Parser, der besser ist als Double.(Try)Parse() versucht, das Zahlenformat automatisch zu erkennen?


Ich denke, das Beste, was Sie in diesem Fall tun können, ist, ihren Input zu nehmen und ihnen dann zu zeigen, was Sie denken, dass sie gemeint haben. Wenn sie nicht einverstanden sind, zeigen Sie ihnen das Format, das Sie erwarten, und lassen Sie sie erneut eingeben.


Der Unterschied zwischen 12.345 in Französisch und Englisch ist ein Faktor von 1000. Wenn Sie einen erwarteten Bereich liefern, in dem max <1000 * min, können Sie leicht erraten.

Nehmen Sie zum Beispiel die Höhe einer Person (einschließlich Babys und Kinder) in mm.

Bei einem Bereich von 200-3000 kann eine Eingabe von 1.800 oder 1.800 eindeutig als 1 Meter und 80 Zentimeter interpretiert werden, während eine Eingabe von 912.300 oder 912.300 eindeutig als 91 Zentimeter und 2,3 Millimeter interpretiert werden kann.





globalization