c# - Parsing von Gleitkommazahlen: Gibt es einen Catch All-Algorithmus?

Translate

Einer der lustigen Teile der multikulturellen Programmierung sind Zahlenformate.

  • Amerikaner verwenden 10.000,50
  • Deutsche benutzen 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 zu verwenden. Daran liegt ein offensichtlicher Fehler: 10.000 würden als 10 interpretiert.

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 eine habe, überprüfen Sie, ob sie mehrmals auftritt, und verwerfen Sie sie, falls dies der Fall ist. Wenn es nur einmal angezeigt wird, prüfen Sie, ob es 3 Ziffern enthält. Wenn ja, verwerfen Sie es, andernfalls verwenden Sie es als Dezimaltrennzeichen.

Die naheliegende "beste Lösung" wäre, die Kultur oder den Browser des Benutzers zu erkennen. Dies funktioniert jedoch nicht, wenn ein Franzose ein Windows / Browser in den USA verwendet.

Enthält das .net Framework einen mythischen Gleitkomma-Parser für schwarze Magie, der besser ist alsDouble.(Try)Parse()beim Versuch, das Zahlenformat automatisch zu erkennen?

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Ich denke, das Beste, was Sie in diesem Fall tun können, ist, ihre Eingaben zu nehmen und ihnen dann zu zeigen, was Sie denken, dass sie gemeint haben. Wenn sie nicht übereinstimmen, zeigen Sie ihnen das erwartete Format und lassen Sie sie es erneut eingeben.

Quelle
Translate

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

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

Wenn ASP.NET irgendwie (dh mithilfe von HTTP-Anforderungsheadern) CultureInfo des aktuellen Benutzers an CultureInfo.CurrentCulture oder CultureInfo.CurrentUICulture übergibt, funktionieren diese einwandfrei.

Quelle
Translate

Sie können nicht allen gefallen. Wenn ich zehn als 10.000 und jemand zehntausend als 10.000 eingebe, können Sie damit nicht umgehen, ohne die Kultur der Eingabe zu kennen. 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 und verwenden Sie den mildesten Parser, den Sie können. Wahrscheinlich so etwas wie:

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

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

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

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

Quelle