String in Fließkommazahl C # parsen

8

Ich habe die Fließkommazahl in der Zeichenkette. Es gibt ein Problem. Nummer verwendet "." nicht "," als Dezimalpunkt.

Dieser Code funktioniert nicht:

%Vor%

Ich weiß, dass ich String-Replace-Funktion verwenden kann, um diese Zeichenfolge vor dem Parsen zu reparieren.

%Vor%

Aber gibt es einen anderen Weg, es zu tun?

    
Hooch 19.03.2011, 23:14
quelle

3 Antworten

6

Um Steven's Frage hinzuzufügen, ist die wichtige Sache warum das Dezimaltrennzeichen . ist.

Wenn die Quelle in einem computerlesbaren Format ist, in dem das Punkt-Dezimal-Trennzeichen als Teil der Dokumentspezifikation angegeben ist, würde ich genau so verfahren, wie es Steven bei der Verwendung von CultureInfo.InvariantCulture tut.

Wenn es sich um eine menschliche Eingabe in einem bestimmten Gebietsschema handelt, sollten Sie dieses Gebietsschema mit dem für dieses Gebietsschema geeigneten CultureInfo abgleichen. Wenn die Software andernfalls mit einem anderen Gebietsschema verwendet wird, haben Sie genau das gegenteilige Problem. Im Allgemeinen möchten Sie die CurrentCulture des Threads so anpassen, dass sie dem entspricht ( CurrentCulture für Formate, CurrentUICulture für Sprachen). Wenn Sie dies getan haben, müssen Sie keine Kultur mehr weitergeben, da die Form float.Parse(string) diese Kultur verwendet. Sie können jedoch float.Parse(string, CurrentCulture) verwenden, um explizit anzugeben, dass Sie dies tun (Und um die Software-Analyse zu stoppen, die sich beschwert, wenn Sie nicht auf diese Art spezifisch sind).

Was wirklich schwierig wird, ist, wenn Sie sowohl Punkt als auch Komma akzeptieren müssen - nicht zuletzt weil viele Kulturen, die Punkt als Dezimaltrennzeichen verwenden, Komma als Tausendertrennzeichen verwenden und es letztlich unmöglich ist, ein eindeutiges Parsen zu garantieren. Unter der Annahme, dass das Tausender-Problem Sie nicht betrifft, ist der Code, den Sie in Ihrer Frage angegeben haben, der Ansatz, obwohl ich das Gegenteil empfehlen würde (Komma durch Punkt ersetzen) und dann mit der invarianten Kultur analysieren, da dann alle entfernt werden weitere Komplikationen durch noch mehr Kulturveränderungen.

    
Jon Hanna 20.03.2011, 00:34
quelle
21

Das Ersetzen von Zeichenfolgen ist sehr zerbrechlich und führt zu Fehlern. Geben Sie stattdessen IFormatProvider an. Zum Beispiel:

%Vor%

Oder Sie können NumberFormatInfo mit einer anderen Überladung von Parse angeben.

    
Steven 19.03.2011 23:15
quelle
1

Es hängt von der aktuellen Kultur der aktuell ausgeführten Thread-Kultur ab.

%Vor%

Wenn Sie strikt kulturspezifisch nicht wollen, dann

%Vor%     
dotnetstep 20.03.2011 02:04
quelle