CString to float bei Win CE

Wu-mc

Mitglied
Hallo Forum,

ich weiß ich bin nahe dran geköpft zu werden, aber irgendwie klappt das ganze nicht so wie es sollte. Und zwar habe ich ein Edit Feld wo Zahlen eingegeben werden, um genau zu sein Geldbeträge. Diese werden als ganze Zahl eingegeben und bei KillFocus wird das Komma gesetzt, also 10000 wird dann zu 100,00. Soweit so gut.

Weise ich dem Feld über den Wizzard eine float Variable zu dann funktioniert das auch Prima, solange es Kommastellen gibt. Also 12345 wird zu 123,45 jedoch 10000 wird zu 100. Außerdem wird das Feld später als String weiterverarbeitet, deshalb wäre das ganze eh schöner wenn es ein CString wäre. Was ja theoretisch auch kein Problem ist, jedoch schafe ich es nicht eine CString Variable in ein float um zu wandeln.

Folgendes hab ich schon versucht:

Code:
float meinFloat = atof(LPCTSTR(m_meinFeld));

float meinFloat = atof(LPTSTR(m_meinFeld));

float meinFloat = atof(m_meinFeld);

float meinFloat = (float)m_meinFeld;

Hab das teilweise sogar hier aus dem Forum wo es anscheinend geklappt haben soll. Bekomme immer sowas in der Art als Fehlermeldung vom Compiler:

cannot convert parameter 1 from 'const unsigned short *' to 'const char *'

und ich bekomm dieses const char * einfach nicht hin.

So jetzt dürft ihr zuschlagen... aber bitte nicht zu fest...

Grüße, Niko
 
Moin moin,

keine Angst hier kommt nicht dein Henker, sondern ein Leidensgenosse:-)

WinCE ist halt nen Tacken einfacher gestrickt, manche Dinge aus der Desktop PC-Geschichte klappen hier einfach nicht...
Aber hier fall ich echt vom Glauben ab ;-)

Zu deinem Problem.
MSDN sagt dir: nicht float sondern double
short ist nichts anderes als char in UniCode, also zwei Byte

Auch wenn jede andere String Funktion bei CE den UniConde haben willl
versuch es mal mit:
Code:
double meinFloat = atof("1234.56");

Das 100,00 zu 100 Problem besteht bei mir ebenfalls nicht mehr. könnte man aber bei der Rückwandlung in String mit %Operator wieder herzaubern:-)

Bei mir ging so so durch den Compiler.

Appropro Compiler welchen nutzt du? Vielleicht Embedded VS c++4.0 von Microsoft? Falls ja kriegst du den Emulator ans laufen, bzw. Beispiel Projekte gestartet? Bei mir fährt zwar der Emulator hoch aber das Projekt Connected nicht, alternativ beschwert der Linker sich über CL.exe oder clarm.exe... je nach ausgewähltem Basissystem.
Falls du dich damit auskennst, wär etwas Hilfe bei mir auch net schlecht :-)

Gruss Michael
 
ohje, auskennen ist zuviel gesagt. Ich muss halt so ein Win CE Gerät prgorammieren und da war eigentlich die ganze Software dabei. Ja es handelt sich um eMbedded VC++ 4.0 aber ich muss bei meinem Projekt nur Strg + F5 drücken dann wird es kompiliert und über Active Sync auf mein Win CE hochgeladen und sofort ausgeführt, also kein Emulator.

Ja das es bei Win CE einige Einschränkungen gibt habe ich schon des öfteren merken müssen. Weiteres Beispiel das ich ein Zeichen eines Strings nicht überprüft bekomm ob es sich bei diesem Zeichen um ein Leerzeichen handelt, weder mit ' ' noch mit (char)32....

Auf jeden Fall vielen Dank für deinen Denkanstoß, werde das am Dienstag sobald ich wieder in der Firma bin mal testen. Mit dem % Operator habe ich das auch bei anderen Floats gemacht und da funktioniert das auch super mit den 2 Nachkommastellen, deshalb wollte ich es diesmal wieder so machen, nur brauche ich halt die Berechnung und wie gesagt, ich hab keine Float Werte aus nem CString raus bekommen. Aber vielleicht klappts ja jetzt.

Sorry das ich dir bei deinem Problem mit eVC++ nicht weiterhelfen kann, aber ist ja ein super Forum hier, da wird dir bestimmt noch geholfen.

Grüße und schönes Wochenende

Niko
 
nAbend,

ich arbeite ebenfalls auf ner anderen Zielhardware und brauch den eumlator nicht unbedingt. Hätte nur manchmal weitergeholfen.

Stimmt das Forum ist super... Hier mal nen Lob an alle Beteiligten...

Gruss und sWe

Michael
 
Hallo CodeFatal,

bin heute wieder in der Firma und konnte deinen Vorschlag testen, geht leider auch nicht und mir ist schon klar warum. Der Compiler beschwert sich ja nicht über das float oder double sondern über den Übergabeparameter von atof ( ).

Also Problem besteht immer noch...

Grüße

Niko Will
 
Also ich hab es jetzt anders gelöst, ist zwar nicht sehr elegant, aber es funktioniert und Win CE lässt mir wohl keine andere Wahl, da alles andere nicht zu funktionieren scheint. Hier mal meine Lösung:

Code:
	char buf[20];
	int i;

	for (i=0; i<m_zahlbetrag.GetLength() && i<8; i++)
	{
		buf[i] = m_zahlbetrag.GetAt(i);
	}

	double betrag = atof(buf)/100;

	sprintf(buf, "%.2f", betrag);

	m_zahlbetrag = buf;

Grüße

Niko
 
Hallo Niko,

hatte meinen Vorschlag unter CE getestet.

Daher die Frage: Welches Projekt nutzt du? Mfc? Bin davon ausgegangen, da du dir nen CString gewünscht hast...

Mein Test-Projekt: Dialogfeld basierende MFC EXE Anwendung...

Probier es doch mal mit nem neuen Projekt, wo du nur den Teil in die OnInitDialog() schreibst... (Da stand es bei mir)...
Dann mal mit dem Debugger schauen, was der ausspuckt...

Hast du auch daran gedacht, das man statt ',' den '.' verwenden muss, um die Komma stelle zu deklarieren?

Gruss Michael
 
Hallo CodeFatal,

ja, habe es im OnInitDialog und es ist eine MFC Anwendung. So wie du es geschrieben hast funktioniert es ja auch, nur nicht wenn ich als Parameter für atof( ) einen CString, also eine Variable von einem Editfeld nehme.

Grüße
 
Hallo CodeFatal,

geht leider auch nicht...

error C2065: 'Lm_zahlbetrag' : undeclared identifier

bei folgendem Code:

Code:
sprintf(buf, "%.2f",atof(_T(m_zahlbetrag)) / 100);
 
Zurück