Gleitkommazahl-Analyse: Gibt es ein Catch-All-Algorithmus?

stimmen
52

Einer der Spaß Teile der Multi-Kulti-Programmierung Zahlenformate.

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

Mein erster Ansatz wäre, um die Zeichenfolge zu nehmen, es rückwärts analysieren, bis mir einen Separator und dies als mein Dezimaltrennzeichens begegnen. Es gibt einen offensichtlichen Fehler mit, dass: 10.000 als 10 interpretiert werden würde.

Ein anderer Ansatz: wenn die Zeichenfolge enthält 2 verschiedene nicht-numerische Zeichen, die letzten als Dezimaltrennzeichen verwenden und die andere verwerfen. Wenn ich nur einen haben, prüfen Sie, ob es mehr als einmal vorkommt, und entsorgen Sie es, wenn es funktioniert. Wenn es nur einmal angezeigt wird, prüfen Sie, ob es drei Stellen nach ihm hat. Wenn ja, ist es zu verwerfen, verwenden Sie es anders als Dezimalzeichen.

Die offensichtliche „beste Lösung“ wäre die Nutzers Kultur oder Browser zu erkennen, aber das funktioniert nicht, wenn Sie einen Franzosen mit einem en-US Fenster / Browser haben.

Hat das NET Framework einig mythischen schwarze Magie Gleitkomma - Parser enthält , das besser ist , als Double.(Try)Parse()bei dem Versuch, die automatischen Erkennung der Anzahl Format?

Veröffentlicht am 01/08/2008 um 20:23
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
26

Ich denke, das Beste, was Sie in diesem Fall tun können, ist ihre Eingabe zu nehmen und dann zeigen sie, was Sie denken, sie bedeuteten. Wenn sie nicht einverstanden sind, zeigen sie das Format Sie erwarten und bekommen sie es wieder zu betreten.

Beantwortet am 02/08/2008 um 00:17
quelle vom benutzer

stimmen
26

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

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

Wenn ASP.NET irgendwie (dh unter Verwendung von HTTP-Request-Header) des aktuellen Benutzers Culture geht entweder CultureInfo.CurrentCulture oder CultureInfo.CurrentUICulture, funktionieren diese in Ordnung.

Beantwortet am 01/08/2008 um 21:02
quelle vom benutzer

stimmen
11

Sie können nicht jedem gefallen. Wenn ich zehn als 10.000 eingeben, und jemand tritt zehntausend als 10.000, können Sie nicht damit umgehen ohne Kenntnis der Kultur des Eingangs. Erkennen Sie die Kultur irgendwie (Browser, Systemeinstellung? -?, Was der Fall Gebrauch ist ASP Interne App oder offen für die Welt), oder geben Sie ein Beispiel für die erwarteten Formatierung, und verwenden Sie die mildeste Parser Sie können. Wahrscheinlich so etwas wie:

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);
Beantwortet am 01/08/2008 um 21:05
quelle vom benutzer

stimmen
9

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

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

Durch die Verwendung eines Bereichs von 200-3000, ein Eingang 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 kann eindeutig als 91 Zentimeter und 2,3 Millimeter interpretiert werden.

Beantwortet am 02/08/2008 um 13:28
quelle vom benutzer

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