www.mikrocontroller.net

Forum: PC-Programmierung float und double als z.B. 1.5 oder 1,5 ?


Autor: Zahlenhansel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: entity (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
',' 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)

Autor: Zahlenhansel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Zahlenhansel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ü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.

Autor: Bartli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Übrigens "CultureInfo" kennt mein C# Express nicht.

Das glaube ich jetzt fast nicht.

CultureInfo befindet sich im Namespace System.Globalization.

Autor: Zahlenhansel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Ü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.

Autor: Bartli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.