War gerade überrascht beim rumspielen mit C# über das Ergebnis Es sollen double Werte eingegeben werden Anzahl der Zahlen eingeben um den Durchschnitt zu berechnen: 2 Erste Zahl: 1.5 Zweite Zahl: 3.5 Ergebnis: 25 lustig oder?
',' ist das Dezimaltrennzeichen, wird von der dt. Landeinstellung übernommen. Zu Überraschungen führt das übrigens oft beim Parsen von String auf de-und en-Windowsversionen mit double.parse(). Man erzwingt dann das Parsen mit Dezimalpunkt über double.Parse("2.3", CultureInfo.InvariantCulture)
Das Ergebnis hängt in der Tat von der Einstellung des Zahlenformats ab. Das Dezimaltrennzeichen steht bei Windows per default auf ','. Der Dezimalpunkt '.' trennt dann Dreierpakete wie 1.200. Ich habs mal probeweise umgestellt auf den Dezimalpunkt und siehe da, das Ergebnis stimmt jetzt mit 2.5. Das heißt aber auch die Software muss unbedingt prüfen welches Zahlenformat eingetellt ist, sonst konvertiert die Funktion gnadenlos 1.5 in 15 ohne eine Exeption auszulösen.
Übrigens "CultureInfo" kennt mein C# Express nicht. Hab das anders gelöst. Konvertiert habe ich zuerst mit der Methode Convert.ToDouble(sVal) wobei sVal ein String ist. Gibt aber noch eine weitere überladene Methode, nämlich Convert.ToDouble(sVal, provider). provider ist ein Objekt vom Typ NumberFormatInfo, dem man mit der Eigenschaft NumberDecimalSeparator einen Dezimalpunkt zuweist. Dann verwendet die Funktion dies als Trennzeichen und nicht die Windows default Einstellung.
> Übrigens "CultureInfo" kennt mein C# Express nicht.
Das glaube ich jetzt fast nicht.
CultureInfo befindet sich im Namespace System.Globalization.
>> Übrigens "CultureInfo" kennt mein C# Express nicht. > Das glaube ich jetzt fast nicht. > CultureInfo befindet sich im Namespace System.Globalization. Du hast recht, ich habs gerade noch mal laufen lassen. Die Hilfe hatte gestern nichts angezeigt, aber ich hab da schlicht was falsch geschrieben, was dann zum Fehler beim Erstellen der Projektmappe führte. Habs dann einfach auskommentiert und erst mal links liegen lassen .. Mit CultureInfo funktioniert das aber genauso, ich habs gerade im Debugger gesehen (kommt 1.5 und nicht 15 raus). Hab halt noch nicht viel mit .NET u. C# gemacht (genau genommen gar nix) und da bin ich schon froh, wenn was klappt. Ist nicht so einfach da nicht die Übersicht zu verlieren, ohne die IDE (die wirklich sehr gut ist) wäre ich glatt verloren. ;) Die CultureInfo Lösung leuchtet mir allerdings noch nicht richtig ein bzw. deren Einfluss auf die Parse-Funktion. Da ist mir meine Lösung mit dem NumberFormatInfo-Objekt, wo der Seperator explizit vorgegeben wird plausibler. Aber egal, will mich nicht an diesem Beispiel festbeißen. Danke auf jeden Fall erst mal euch beiden.
Grob gesagt repräsentiert ein CultureInfo Objekt halt eine Locale mit Informationen wie z.B. Dezimalzahlen oder auch ein Datum in einer bestimmten Region dargestellt werden. Für Dezimalzahlen enthält CultureInfo.InvariantCulture (vermutlich) bereits einen NumberFormatProvider welcher dasselbe macht wie dein von Hand konstruierter NumberFormatProvider. Schaust du dir CultureInfo und NumberFormatProvider an so siehst du, dass beide IFormatProvider implementieren, und das zweite Argument double.Parse() ist ebenfalls vom Typ IFormatProvider. Für deinen speziellen Anwendungsfall ist CultureInfo.InvariantCulture halt eine nette und häufig verwendete Abkürzung, da du dir nicht selber einen NumberFormatProvider bauen musst.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.