Frage

Einer der unterhaltsamen Aspekte der multikulturellen Programmierung sind Zahlenformate.

  • Amerikaner verwenden 10.000,50
  • Die Deutschen verwenden 10.000,50
  • Französischer Gebrauch 10 000,50

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

Ein anderer Ansatz:Wenn die Zeichenfolge zwei verschiedene nicht numerische Zeichen enthält, verwenden Sie das letzte als Dezimaltrennzeichen und verwerfen Sie die anderen.Wenn ich nur eines habe, überprüfe, ob es mehr als einmal vorkommt, und verwerfe es, wenn dies der Fall ist.Wenn es nur einmal vorkommt, prüfen Sie, ob danach drei Ziffern stehen.Wenn ja, verwerfen Sie es, andernfalls verwenden Sie es als Dezimaltrennzeichen.

Die offensichtliche „beste Lösung“ wäre, die Kultur oder den Browser des Benutzers zu erkennen, aber das funktioniert nicht, wenn Sie einen Franzosen haben, der ein en-US-Windows/Browser verwendet.

Enthält das .net Framework einen mythischen Gleitkomma-Parser mit schwarzer Magie, der besser ist als Double.(Try)Parse() beim Versuch, das Zahlenformat automatisch zu erkennen?

War es hilfreich?

Lösung

Ich denke, das Beste, was Sie in diesem Fall tun können, ist, ihre Eingaben aufzunehmen und ihnen dann zu zeigen, was sie Ihrer Meinung nach gemeint haben.Wenn sie nicht einverstanden sind, zeigen Sie ihnen das erwartete Format und bitten Sie sie, es erneut einzugeben.

Andere Tipps

Ich kenne die ASP.NET-Seite des Problems nicht, aber .NET hat eine ziemlich mächtige Klasse: System.Globalization.CultureInfo.Sie können den folgenden Code verwenden, um eine Zeichenfolge zu analysieren, die einen Double-Wert enthält:

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

Wenn ASP.NET irgendwie (d. h.(unter Verwendung von HTTP-Anforderungsheadern) übergibt die CultureInfo des aktuellen Benutzers entweder an CultureInfo.CurrentCulture oder CultureInfo.CurrentUICulture. Diese funktionieren einwandfrei.

Man kann es nicht jedem recht machen.Wenn ich zehn als 10.000 eingebe und jemand zehntausend als 10.000 eingibt, können Sie das nicht bewältigen, ohne die Kultur der Eingabe zu kennen.Irgendwie die Kultur erkennen (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 können.Wahrscheinlich so etwas wie:

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

Der Unterschied zwischen 12,345 in Französisch und Englisch beträgt den Faktor 1000.Wenn Sie einen erwarteten Bereich mit max. < 1000*min angeben, können Sie dies leicht erraten.

Nehmen Sie zum Beispiel die Körpergröße einer Person (einschließlich Babys und Kinder) in mm.

Bei Verwendung eines Bereichs 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top