PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C#: string zu double konvertieren


Elemental
2003-09-02, 15:50:20
Ich versuche gerade einen string, der einen double-Wert enthält, in einen double zu schreiben.

double test = Convert.ToDouble("5.3");

Allerdings steht in der Variablen "test" dann nicht "5.3" sondern "53.0" ???


mfG
Elemental

Demirug
2003-09-02, 15:53:32
Du solltest im auch noch sagen das du ein Englisches Zahlenformat hast. Auf einem deutschen System benutzt die Convert Klasse auch die deutsche Zahlenschreibweise und da ist der Punkt nur eine Lesehilfe.

Elemental
2003-09-02, 15:57:54
Weisst du zufällig, wie man ihm sagt, dass es englische Schreibweise ist? In der MSDN Library hab ich dazu nichts gefunden :rolleyes:

Exxtreme
2003-09-02, 16:00:30
Da gibt es eine Systemvariable namens AFAIK DecimalSeparator.

Vielleicht hilft dir das weiter.

Elemental
2003-09-02, 16:23:39
Hab noch ne andere Alternative gefunden:
Der string kommt aus einem xml file und es gibt eine extra XmlConvert Klasse -> XmlConvert also provides methods that enable you to convert from a string to a .NET Framework data type and vice-versa. Locale settings are not taken into account during data conversion.
:D

Dummerweise schreibt mir XmlConvert.ToDouble auch keine "5.3" in meine Variable rein, sondern "5.2999999999999998" :O

Demirug
2003-09-02, 16:56:03
Für was ist wohl der zweite Parameter beim ToDouble da?

Genau um die Formatierung anzugeben.

Convert.ToDouble ("5.3", NumberFormatInfo.InvariantInfo);

In deinem Fall müsste InvariantInfo reichen ansonsten musst du dir ein NumberFormatInfo Object erzeugen und die Properties entsprechend setzten.

Tom Servo
2003-09-02, 17:56:00
Das mit Convert sehe ich hier zum ersten mal (bin noch neu in C#). Ich dachte dazu ist die Parse-Methode eines Types gedacht. Also z.B.:


void f() {
string fs = "4.2";
fs = fs.Replace(".", System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator);
float fn = float.Parse(fs, System.Globalization.NumberStyles.AllowDecimalPoint);
}


Mit double geht das genauso.

edit: Das mit dem 53.0 hätte ich auch, wenn ich AllowDecimalPoint weglasse.

edit2: Das mit InvariantInfo muss ich auch gleich mal probieren. das mit dem Replace ist ja etwas blöd.

edit3: Funktioniert prima. Convert fängt wohl nur zusätzlich noch manche bei Parse nicht erlaubten Eingaben ab und gibt 0 zurück und ruft erst dann Parse auf.


void f() {
string fs = "4.2";
float fn = float.Parse(fs, System.Globalization.NumberFormatInfo.InvariantInfo);
}

Tom Servo
2003-09-02, 18:46:51
Geht das Umwandeln eigentlch auch in die andere Richtung?

Ich muss eine Fliesskommazahl in einen String umwandeln der ein '.' statt ',' benutzt. Bisher mache ich das noch mit:

n.ToString().Replace(System.Globalization.NumberFormatInfo.CurrentInfo.NumberDec imalSeparator, ".")

Demirug
2003-09-02, 19:20:21
Original geschrieben von Tom Servo
Geht das Umwandeln eigentlch auch in die andere Richtung?

Ich muss eine Fliesskommazahl in einen String umwandeln der ein '.' statt ',' benutzt. Bisher mache ich das noch mit:

n.ToString().Replace(System.Globalization.NumberFormatInfo.CurrentInfo.NumberDec imalSeparator, ".")

Ja Convert funktioniert auch in die andere Richtung. Ist dann eben ToString.

Tom Servo
2003-09-03, 07:23:44
Danke. Hatte nicht gemerkt, dass man ein NumberFormatInfo als IFormatProvider übergeben soll. Geht dann auch mit n.ToString(), da der ja auch für IFormatProvider überladen ist.

Elemental
2003-09-03, 08:29:19
Original geschrieben von Demirug
Für was ist wohl der zweite Parameter beim ToDouble da?

Genau um die Formatierung anzugeben.

Convert.ToDouble ("5.3", NumberFormatInfo.InvariantInfo);

In deinem Fall müsste InvariantInfo reichen ansonsten musst du dir ein NumberFormatInfo Object erzeugen und die Properties entsprechend setzten.


Ups, hab garnicht bemerkt, dass es da auch ne Version mit 2 Parametern gibt :D