Forum: PC-Programmierung [c#] String zu Fließkommazahl


von Pascal H. (pase-h)


Lesenswert?

Hallo,
Ich versuche zurzeit meinen Beschleunigungssensor am PC einzulesen, was 
auch funktioniert. Jedoch habe ich das Problem, dass ich den Wert am PC 
weiterverarbeiten will.
Die einzelnen Werte sind mit "$" getrennt:
Wert1$Wert2$Wert3
Das Problem ist jetzt nur, dass die werte meistens im 0,xxx bereich 
liegen.
Bis jetzt habe ich die Zahlen so angezeigt:
1
        void Inputform()
2
        {
3
            try
4
            {
5
                Werte = indata.Split('$');               
6
                  label4.Text = Werte[0]; //X Wert
7
                  label5.Text = Werte[1]; //Y Wert
8
                  label6.Text = Werte[2]; //Z Wert

Jetzt muss ich aber die Werte weiterverarbeiten. Dabei habe ich schon 
versucht die Werte in Double und float zu konvertieren
1
//double:
2
double X = Convert.ToDouble(Werte[0]);
3
4
//float:
5
float X = (float)Convert.ToDouble(Werte[0]);
6
//oder
7
 X = float.Parse(Werte[0]);

Jedes mal erhalte ich aber falsche Ergebnisse, da bei der Konvertierung 
das Komma nicht berücksichtigt wird:
aus 0,921 wird 921
aus 1,222 wird 1222

Jetzt meine Frage:
Wie kann ich den String in eine Variable Konvertieren, bei der das Komma 
im String berücksichtigt wird?

Mfg

von Karl H. (kbuchegg)


Lesenswert?

Pascal H. schrieb:

> Jedes mal erhalte ich aber falsche Ergebnisse, da bei der Konvertierung
> das Komma nicht berücksichtigt wird:
> aus 0,921 wird 921
> aus 1,222 wird 1222

In (ernstzunehmenden) Programmiersprachen verwendet man generell einen 
Dezimalpunkt und kein Komma. Mach einen Zeichenersatz von ',' auf '.' 
dann können deine Parse Funktionen damit auch was anfangen. Oder lass 
dir vom Sender die Werte gleich vernünftig mit einem '.' generieren.

deutscher Sprachraum:
  Dezimal-Komma, Tausender-Punkte   4.567,9     viertausend fünfhundert
                                                siebenunssechzig komma
                                                neun

englischsprachiger Sprachraum:
  Dezimal-Punkt, Tausender-Komma    4,567.9     fourthousend fivehundred
                                                sixtyseven point
                                                nine


Programmiersprachen kommen aus dem englischen Sprachraum.

von __tom (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> In (ernstzunehmenden) Programmiersprachen verwendet man generell einen
> Dezimalpunkt und kein Komma. Mach einen Zeichenersatz von ',' auf '.'
> dann können deine Parse Funktionen damit auch was anfangen.

in c# geht das übrigens so:


> englischsprachiger Sprachraum:
1
float.Parse(Werte[0], System.Globalization.CultureInfo.InvariantCulture);


> deutscher Sprachraum:
1
float.Parse(Werte[0], new System.Globalization.CultureInfo("de-DE"));

von Markus V. (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> In (ernstzunehmenden) Programmiersprachen verwendet man generell einen
> Dezimalpunkt und kein Komma

Wenn Du (Karl Heinz Buchegger) damit C/C++ meinst, könntest Du evtl. 
Recht haben. Im Allgemeinen verwendet man Konvertierungsmethoden, die 
die kulturspezifischen Eigenheiten des jeweiligen Users berücksichtigen. 
Im vorliegenden Fall also, dass der User ein Komma und keinen Punkt 
eingibt, weil das in seinem Kulturkreis Konvention ist.

Im Speziellen (in C#) wären das z.B. Double.Parse(string s,NumberStyles 
style, IFormatProvider provider, out double result) oder auch 
Convert.ToDouble(Object value,IFormatProvider provider). Der Parameter 
provider kann z.B. durch die Klasse CultureInfo zur Verfügung gestellt 
werden. Wie das genau geht, müsstest Du (Pascal H.) allerdings über die 
MSDN in Erfahrung bringen.

Gruß
Markus

von Markus V. (Gast)


Lesenswert?

__tom schrieb:
>> englischsprachiger Sprachraum:
> float.Parse(Werte[0], System.Globalization.CultureInfo.InvariantCulture);

Wie der Bezeichner InvariantCulture besagt, es handelt sich um ein 
neutrales Format, und nicht um ein englischsprachiges. Darin gibt es 
durchaus Unterschiede. Ein englisches Format würdest Du z.B. mit 
CreateSpecificCulture("en-US") bekommen. Die InvariantCulture entspricht 
übrigens dem Format, das Karl Heinz Buchegger in seinem Post 
vorgeschlagen hatte.

__tom schrieb:
>> deutscher Sprachraum:
> float.Parse(Werte[0], new System.Globalization.CultureInfo("de-DE"));

Das würde prinzipiell funktionieren. Normalerweise sollte man aber die 
statische Methode CreateSpecificCulture("de-DE") verwenden, da diese 
Variante nur genau einmal ein CultureInfo-Objekt für "de-DE" anlegt.

Gruß
Markus

von __tom (Gast)


Lesenswert?

Markus V. schrieb:
> Wie der Bezeichner InvariantCulture besagt, es handelt sich um ein
> neutrales Format, und nicht um ein englischsprachiges

stimmt, danke, mir lag es auf der zunge :)

von Aslof (Gast)


Lesenswert?

Funktioniert auch ganz wunderbar mit Convert. ... in C#
1
Convert.ToDouble(Wert[0],System.Globalization.CultureInfo.InvariantCulture)

Danke & Mfg Aslof

von A. V. (kra5h)


Lesenswert?

...oder man schreibt einfach:

double Wert0 = Convert.ToDouble(Convert.ToDecimal(Werte[0]));

..oder man rechnet halt mir decimal weiter:
decimal Wert0 = Convert.ToDecimal(Werte[0]);

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
Noch kein Account? Hier anmelden.