Autor Beitrag
relapse
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Fr 27.01.12 14:19 
Hallo, hab' folgendes Problem: Ich versuche string nach double zu konvertieren, mit Hilfe meiner Funktion:

ausblenden 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)
                ; // Exception
            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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: 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:

ausblenden 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)
                ; // Exception
            return d;
        }

Gibt's vielleicht eine schönere Lösung? Ich vermute, da muss irgendwas in der Richtung "CultureInfo" sein...
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 nehmen der man das Nummernformat mitgeben kann. Ein Aufruf von string.ToString sieht einfach sch*se aus.
relapse Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Fr 27.01.12 15:15 
Danke!
Zitat:
Ein Aufruf von string.ToString sieht einfach sch*se aus.
:oops: 8) :roll:
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Fr 27.01.12 16:29 
Ist halt eine Angewohnheit aus C++.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 27.01.12 16:52 
Und wenn schon rumhacken, dann mach ich auch mal mit ;-)
Man sollte (auch in C++) mit
ausblenden C#-Quelltext
1:
if (!success)					

abfragen (s. z.B. [Tipp] Anfängerfehler == true / == false)...
C-Bär
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.