www.mikrocontroller.net

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


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Pascal H. (pase-h) Flattr this
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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:
        void Inputform()
        {
            try
            {
                Werte = indata.Split('$');               
                  label4.Text = Werte[0]; //X Wert
                  label5.Text = Werte[1]; //Y Wert
                  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
//double:
double X = Convert.ToDouble(Werte[0]);

//float:
float X = (float)Convert.ToDouble(Werte[0]);
//oder
 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

Autor: Karl Heinz Buchegger (kbuchegg) (Moderator)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: __tom (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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:
float.Parse(Werte[0], System.Globalization.CultureInfo.InvariantCulture);


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

Autor: Markus V. (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Markus V. (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: __tom (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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 :)

Autor: Aslof (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Funktioniert auch ganz wunderbar mit Convert. ... in C#
Convert.ToDouble(Wert[0],System.Globalization.CultureInfo.InvariantCulture)

Danke & Mfg Aslof

Autor: A. V. (kra5h)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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]);

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net