Entwickler-Ecke
C# - Die Sprache - Komma wird verschoben
relapse - Fr 27.01.12 14:19
Titel: Komma wird verschoben
Hallo, hab' folgendes Problem: Ich versuche string nach double zu konvertieren, mit Hilfe meiner Funktion:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| private static double StrToDouble(string s) { double d = 0; if (s.Equals(string.Empty)) return 0; bool success = double.TryParse(s.ToString(CultureInfo.InvariantCulture), out d); if (false == success) ; return d; } |
Dabei komme ich zu diesem Ergebnis:
string s ("64.80000000000001")
return d (6480000000000001.0)
Woran liegt es? Zu viele Nachkommastellen im übergebenen String?
Danke!
relapse - Fr 27.01.12 14:52
Hab's gefunden. Es liegt am Punkt-Zeichen im übergebenen String. Wenn man es mit Komma ersätzt, dann klappt's:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| private static double StrToDouble(string s) { double d = 0; if (s.Equals(string.Empty)) return 0; s = s.Replace('.', ','); bool success = double.TryParse(s.ToString(CultureInfo.InvariantCulture), out d); if (false == success) ; return d; } |
Gibt's vielleicht eine schönere Lösung? Ich vermute, da muss irgendwas in der Richtung "CultureInfo" sein...
Ralf Jansen - Fr 27.01.12 15:04
Zitat: |
Ich vermute, da muss irgendwas in der Richtung "CultureInfo" sein... |
Richtig du müßtest eine Culture nehmen(oder dir eine erstellen) in der das Komma der Separator ist. Oder je nachdem was die Quelle des Strings ist einfach keine nehmen. Denn wenn der String mit aktueller CultureInfo erstellt wurde dann wird es auch mit aktuelle CultureInfo zu parsen sein.
Wenn du explizit das Komma brauchst solltest du die Überladung von
TryParse [
http://msdn.microsoft.com/de-de/library/zf50za27%28v=vs.100%29.aspx] nehmen der man das Nummernformat mitgeben kann. Ein Aufruf von string.ToString sieht einfach sch*se aus.
relapse - Fr 27.01.12 15:15
Danke!
Zitat: |
Ein Aufruf von string.ToString sieht einfach sch*se aus. |
:oops: 8) :roll:
Ralf Jansen - Fr 27.01.12 15:25
Wo wir schon bei Sachen sind die doof aussehen ;) Sorry das ich darauf rumhacke.
Zitat: |
if (false == success) |
Das mag im letzten Jahrtausend in C hip gewesen sein. In aktuelleren Sprachen sind die Zuweisungsoperation und die Vergleichsoperation (und meist auch die dazugehörenden Operatoren) aber eindeutig unterscheidbar. Das Umdrehen des Vergleichs ist also mittlerweile völlig unnötig (der Compiler knallt wenn du da was falsch machst) und schadet nur der Lesbarkeit.
relapse - Fr 27.01.12 16:29
Ist halt eine Angewohnheit aus C++.
C-Bär - Mi 01.02.12 20:28
Mal die Convert-Klasse ausprobiert? :) Du machst dir da wirklich sonst unnötige Arbeit außer du machst das nur zu Übungszwecken. :)
Ralf Jansen - Mi 01.02.12 20:33
Zitat: |
Mal die Convert-Klasse ausprobiert? |
Macht keinen Unterschied. Convert.ToDouble ruft selbst auch nur double.Parse auf und mann muss natürlich genauso auf die passende CultureInfo bzw. den FormatProvider achten.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!