2008-09-29 20 views
34

Was ist der beste Weg, um einen Float in CSharp zu analysieren? Ich weiß über Tryparse, aber was ich besonders wundere mich über Punkte, Kommas usw.Die beste Methode zum Floaten?

Ich habe Probleme mit meiner Website. Auf meinem Dev-Server ist das ',' für Dezimalzahlen, das '.' für Trennzeichen. Auf dem Prod-Server ist es umgekehrt. Wie kann ich das am besten erfassen?

+1

Bereit, dass es scheint, jeder tut es. Ich persönlich versuche mich von <3 char Suchbegriffe fernzuhalten. Ich denke, es ist etwas, das mir aus vergangenen Zeiten, als alle Suchen> 3 Zeichen sein mussten, treu blieb. Auch das # Zeichen lässt meine Spiderscences kribbeln. –

Antwort

23

Hängt davon ab, woher der Eingang kommt.

Wenn Ihre Eingabe vom Benutzer stammt, sollten Sie die CultureInfo verwenden, die der Benutzer/die Seite verwendet().

Sie können einen Hinweis auf die Kultur des Benutzers erhalten, indem Sie auf die HttpRequest.UserLanguages Eigenschaft schauen. (Nicht korrekt 100%, aber ich habe es eine sehr gute erste Schätzung gefunden) Mit diesen Informationen können Sie die am Anfang der Seite einstellen. Wenn Ihre Eingabe von einer internen Quelle stammt, können Sie InvariantCulture verwenden, um die Zeichenfolge zu analysieren.

Die Parse-Methode ist etwas einfacher zu verwenden, wenn Ihre Eingabe von einer kontrollierten Quelle stammt. Das heißt, Sie haben die Zeichenfolge bereits validiert. Parse löst eine (langsame) Ausnahme aus, wenn sie fehlschlägt.

Wenn der Eingang ist unkontrolliert, (vom Benutzer oder einer anderen Internet-Quelle) die TryParse sieht besser für mich.

3

Verwenden Sie eine neutrale Kultur (oder eine, die Sie kennen) beim Parsen mit Try/Parse.

5

Wenn Sie Werte (Zahlen, Datum, Uhrzeit, etc ...) für interne Zwecke beibehalten möchten. Verwenden Sie jedes Mal "InvariantCulture" zum Formatieren von & Werten. „InvariantCulture“ ist das gleiche auf jedem Computer, jedes Betriebssystem mit jeder Kultur des Benutzers/Sprache/etc ...

string strFloat = (15.789f).ToString(System.Globalization.CultureInfo.InvariantInfo); 
float numFloat = float.Parse(System.Globalization.CultureInfo.InvariantInfo, strFloat); 
string strNow = DateTime.Now.ToString(System.Globalization.CultureInfo.InvariantInfo); 
DateTime now = DateTime.Parse(System.Globalization.CultureInfo.InvariantInfo, strNow); 
+0

stimmt, ist aber nicht wirklich auf die Frage bezogen. –

1

Pass in ein CultureInfo oder NumberFormatInfo, das die Kultur darstellt Sie den Schwimmer analysieren möchten, wie; Dies steuert, welche Zeichen für Dezimalstellen, Gruppenseparatoren usw. verwendet werden.

Zum Beispiel, um sicherzustellen, dass das '.' Das Zeichen wurde als Dezimaltrennzeichen behandelt, das Sie in CultureInfo.InvariantCulture übergeben können (dieses ist normalerweise sehr nützlich in Serveranwendungen, in denen Sie unabhängig von der Kultur der Umgebung tendenziell die gleichen Eigenschaften haben möchten).

41

Ich stimme mit leppies Antwort überein; dass in Bezug auf Code zu setzen:

string s = "123,456.789"; 
float f = float.Parse(s, CultureInfo.InvariantCulture); 
5

Sie immer die Überlastung von Parse verwenden könnte, die die Kultur enthält zu benutzen?

zum Beispiel:

Double number = Double.Parse("42,22", new CultureInfo("nl-NL").NumberFormat); // dutch number formatting 

Wenn Sie die Kontrolle über alle Daten verfügen, sollten Sie "CultureInfo.InvariantCulture" in allen Ihren Code verwenden.

0

Versuchen Sie, float.Parse zu vermeiden, verwenden Sie stattdessen TryParse, da es viel besser funktioniert, aber die gleiche Aufgabe erfüllt. dies gilt auch für Double, DateTime, etc ...

(einige Arten auch TryParseExact bieten, die auch noch besser abschneidet!)

+1

Funktioniert TryParse wirklich schneller, auch wenn alle Daten gültig sind? Ich würde erwarten, dass sie die gleiche Leistung im "Erfolg" -Fall haben, aber dafür, dass es mit TryParse schneller ist als mit Parse, weil die Kosten des Auslösens von Ausnahmen höher sind. –

+0

Und was wiederum, wenn TryParse false zurückgibt - werden Sie eine Ausnahme auslösen? In diesem Fall ist float.Parse effizienter als TryParse! – Sklivvz

+0

Wenn die zu analysierenden Strings meistens gültige Floats sind, ist tryparse definitiv schneller. Wenn Sie viele verschiedene Strings haben, ist vielleicht parse die bessere Wahl, aber wenn Sie viele Strings (Dutzende von Tausenden) erhalten, die alle (in 99% der Fälle) gültige Floats in einer String-Repräsentation sind, verwenden Sie tryparse. –

0

Die Quelle eine Eingabe von einer Website ist. Ich kann mich nicht darauf verlassen, dass es gültig ist. Also ging ich mit TryParse wie bereits erwähnt. Aber ich kann nicht herausfinden, wie ich die currentCulture dazu geben kann.

Auch dies würde mir die Kultur des Servers es aktuell läuft, aber da es das World Wide Web ist, kann der Benutzer von überall sein ...

-1

Da Sie nicht die Web-Benutzer wissen Kultur, können Sie einige Rätselraten tun. TryParse mit einer Kultur, die verwendet, für Separatoren und. für Dezimal, UND TryParse mit einer Kultur, die verwendet. für Trennzeichen und für Dezimalzahlen. Wenn beide Erfolg haben, aber unterschiedliche Antworten ergeben, müssen Sie den Benutzer fragen, was er beabsichtigt hat. Andernfalls können Sie normal fortfahren, wenn Sie zwei gleiche Ergebnisse oder ein verwendbares Ergebnis oder kein verwendbares Ergebnis erhalten.

+0

Wenn Sie die akzeptierte Antwort abschreiben wollen, dann erklären Sie, warum Sie es sind Es wurde markiert ... –

+0

Diese Antwort wurde abgeschliffen, bevor sie angenommen wurde. Eigentlich bin ich etwas überrascht zu sehen, dass dies akzeptiert wurde, da jemand anderes vorgeschlagen hat, die Eigenschaft HttpRequest.UserLanguages ​​zu betrachten. Ich denke, meine Antwort sollte auf dem zweiten Platz sein. –

+0

Oh, jetzt wurde es ein zweites Mal nach der Annahme markiert. Ich stimme diesem Vorschlag jetzt zu, wer auch immer nach der Annahme abgemeldet hat, sollte zumindest erklären warum. –

0

können Sie aktuelle Cuklture Ihres Servers mit einer einfachen Aussage wissen:

System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CurrentCulture; 

Beachten Sie, dass es id ein CurrentUICulture Eigenschaft, aber UICulture von ResourceMeanager Form multilanguages ​​Anwendungen verwendet wird. Für die Formatierung von Zahlen müssen Sie CurrentCulture berücksichtigen.

Ich hoffe, das wird dir helfen

Verwandte Themen