Ich möchte einen String wie "3.5"
einen Double analysieren . Jedoch,
double.Parse("3.5")
ergibt 35 und
double.Parse("3.5", System.Globalization.NumberStyles.AllowDecimalPoint)
wirft a FormatException
.
Jetzt ist das Gebietsschema meines Computers auf Deutsch eingestellt, wobei ein Komma als Dezimaltrennzeichen verwendet wird. Es könnte etwas damit zu tun haben und als Eingabe double.Parse()
erwarten "3,5"
, aber ich bin nicht sicher.
Wie kann ich eine Zeichenfolge analysieren, die eine Dezimalzahl enthält, die möglicherweise wie in meinem aktuellen Gebietsschema angegeben formatiert ist oder nicht?
Antworten:
quelle
XmlConvert
Klasse gerne ... hast du irgendwelche Ideen, ob dies besser, schlechter und / oder anders ist als die VerwendungCultureInfo.InvariantCulture
?XmlConvert
ist nicht wirklich dazu gedacht, einen einzelnen Doppelwert im Code zu analysieren. Ich bevorzuge zu verwendendouble.Parse
oderConvert.ToDouble
das macht meine Absicht offensichtlich.Normalerweise verwende ich eine Multikulturfunktion, um Benutzereingaben zu analysieren, hauptsächlich, weil jemand, der an das Nummernfeld gewöhnt ist und eine Kultur verwendet, die ein Komma als Dezimaltrennzeichen verwendet, den Punkt des Nummernblocks anstelle eines Kommas verwendet.
Achtung, @ nikie Kommentare sind wahr. Zu meiner Verteidigung verwende ich diese Funktion in einer kontrollierten Umgebung, in der ich weiß, dass die Kultur entweder en-US, en-CA oder fr-CA sein kann. Ich benutze diese Funktion, weil wir auf Französisch das Komma als Dezimaltrennzeichen verwenden, aber jeder, der jemals im Finanzbereich gearbeitet hat, wird immer das Dezimaltrennzeichen auf dem Nummernblock verwenden, aber dies ist ein Punkt, kein Komma. Selbst in der fr-CA-Kultur muss ich eine Zahl analysieren, die einen Punkt als Dezimaltrennzeichen hat.
quelle
Ich konnte keinen Kommentar schreiben, also schreibe ich hier:
double.Parse ("3.5", CultureInfo.InvariantCulture) ist keine gute Idee, da wir in Kanada 3,5 statt 3,5 schreiben und diese Funktion 35 ergibt.
Ich habe beide auf meinem Computer getestet:
Dies ist ein korrekter Weg, den Pierre-Alain Vigeant erwähnt hat
quelle
Ersetzen Sie das Komma vor dem Parsen durch einen Punkt. Nützlich in Ländern mit einem Komma als Dezimaltrennzeichen. Denken Sie daran, Benutzereingaben (falls erforderlich) auf ein Komma oder einen Punkt zu beschränken.
quelle
Der Trick besteht darin, eine invariante Kultur zu verwenden, um Punkte in allen Kulturen zu analysieren.
quelle
Schauen Sie, jede Antwort oben, die vorschlägt, eine Zeichenfolge durch eine konstante Zeichenfolge zu ersetzen, kann nur falsch sein. Warum? Weil Sie die Regionseinstellungen von Windows nicht respektieren! Windows stellt sicher, dass der Benutzer die Freiheit hat, beliebige Trennzeichen festzulegen. Er kann das Bedienfeld öffnen, in das Regionsfenster gehen, auf Erweitert klicken und den Charakter jederzeit ändern. Auch während Ihres Programmlaufs. Denken Sie daran. Eine gute Lösung muss sich dessen bewusst sein.
Zuerst müssen Sie sich fragen, woher diese Nummer kommt, die Sie analysieren möchten. Wenn es von der Eingabe in .NET Framework kommt, kein Problem, da es im gleichen Format sein wird. Aber vielleicht kam es von außen, vielleicht von einem externen Server, vielleicht von einer alten Datenbank, die nur String-Eigenschaften unterstützt. Dort sollte der Datenbankadministrator eine Regel angegeben haben, in welchem Format die Nummern gespeichert werden sollen. Wenn Sie beispielsweise wissen, dass es sich um eine US-Datenbank im US-Format handelt, können Sie diesen Code verwenden:
Dies wird überall auf der Welt gut funktionieren. Und bitte verwenden Sie nicht 'Convert.ToXxxx'. Die 'Convert'-Klasse dient nur als Basis für Conversions in jede Richtung. Außerdem: Sie können den ähnlichen Mechanismus auch für DateTimes verwenden.
quelle
quelle
Meine zwei Cent zu diesem Thema, die versuchen, eine generische, doppelte Konvertierungsmethode bereitzustellen:
Funktioniert wie erwartet mit:
Keine Standardkonvertierung implementiert ist , so wäre es nicht zu analysieren versuchen
1.3,14
,1,3.14
oder ähnliche Fälle.quelle
Der folgende Code erledigt den Job in jedem Szenario. Es ist ein bisschen Parsen.
quelle
Ich denke, eine 100% korrekte Konvertierung ist nicht möglich, wenn der Wert aus einer Benutzereingabe stammt. Wenn der Wert beispielsweise 123,456 ist, kann es sich um eine Gruppierung oder einen Dezimalpunkt handeln. Wenn Sie wirklich 100% benötigen, müssen Sie Ihr Format beschreiben und eine Ausnahme auslösen, wenn es nicht korrekt ist.
Aber ich habe den Code von JanW verbessert, damit wir ein bisschen mehr auf 100% kommen. Die Idee dahinter ist, dass wenn das letzte Trennzeichen ein groupSeperator ist, dies eher ein ganzzahliger Typ als ein Double ist.
Der hinzugefügte Code befindet sich im ersten if von GetDouble .
quelle
quelle
Anstatt in allen Parses ein Gebietsschema angeben zu müssen, ziehe ich es vor, ein anwendungsweites Gebietsschema festzulegen. Wenn die Zeichenfolgenformate jedoch nicht in der gesamten App konsistent sind, funktioniert dies möglicherweise nicht.
Wenn Sie dies zu Beginn Ihrer Anwendung definieren, erwarten alle Doppelparsen ein Komma als Dezimaltrennzeichen. Sie können ein geeignetes Gebietsschema festlegen, sodass das Trennzeichen für Dezimalstellen und Tausenderzeichen zu den Zeichenfolgen passt, die Sie analysieren.
quelle
Es ist schwierig, ohne anzugeben, nach welchem Dezimaltrennzeichen gesucht werden soll, aber wenn Sie dies tun, verwende ich Folgendes:
Dies sollte mit jeder Kultur funktionieren. Im Gegensatz zu Implementierungen, die anstelle von Swap ersetzen, können Zeichenfolgen mit mehr als einem Dezimaltrennzeichen nicht korrekt analysiert werden.
quelle
Ich habe auch den Code von @JanW verbessert ...
Ich brauche es, um Ergebnisse von medizinischen Instrumenten zu formatieren, und sie senden auch "> 1000", "23.3e02", "350E-02" und "NEGATIVE".
quelle
quelle
Ich denke, es ist die beste Antwort:
quelle
Das Folgende ist weniger effizient, aber ich benutze diese Logik. Dies gilt nur, wenn Sie zwei Nachkommastellen haben.
quelle
Multiplizieren Sie die Zahl und dividieren Sie sie durch das, womit Sie sie zuvor multipliziert haben.
Beispielsweise,
quelle