Konvertierungen
-
Hallo NG,
ich habe einen CString, den ich in einen Double oder Float verwandeln will.
In den FAQ habe ich die Methode atof() gefunden. Jedcoh erzeugt mein Quellcode eine weitere Fehlermeldung.CString CGrid2Dlg::makeFloat(CString str) { double zahl = atof (str); str.Format(_T("%.2f"),zahl); return str; }
Die Fehlermeldung:
error C2664: 'atof' : cannot convert parameter 1 from 'class CString' to 'const char *'
Der Fehler ist mir klar, jedoch weiß ich nicht, wie ich einen CString in einen char * konvertiere.
Vielen Dank!
Gruß Walter
-
Hallo,
du kannst einen einfachen Typecast machen, in deinem Fall:CString CGrid2Dlg::makeFloat(CString str) { double zahl = atof ((char*)str); str.Format(_T("%.2f"),zahl); return str; } Vielleicht gibt es noch ne sauberere Lösung.... Gruß Thomas
-
CString CGrid2Dlg::makeFloat(CString str) { double zahl = atof (str.GetBuffer(0)); str.Format(_T("%.2f"),zahl); return str; }
-
uhhhh, son Mist!
Denkfehler, geht natürlich nicht so.... (schäm)
-
Jo, die gibts es, ein cast mit LPCTSTR.
Wenn du ein (char*) str machst, castest du den Pointer auf eine CString-Class in einen char-pointer. Ok, zur Zeit läufts, da zufällig das char-arry im CString auf der selben adresse leigt wie die classe, wer sagt dir aber das dies so bleibt?
Wenn du das ganze in einen const char* (LPCTSTR) castest, sorgt die Klasse dafür (uberladener operator), dass alles glatt läuft
-
oh, wohl etwas spät.... GetBuffer ist die nächste Möglichkeit
-
Erst mal vielen Dank für die vielen Antworten!
das mit dem GetBuffer erzeugt bei mir folgende Fehlermeldung:
error C2664: 'atof' : cannot convert parameter 1 from 'unsigned short *' to 'const char *'...
und wie man den const char* (LPCTSTR) anwendet, weiß ich leider nicht.
Könnt Ihr mir bitte noch etwas weiter helfen?.
Vielen Dank!
Gruß Walter
-
CString CGrid2Dlg::makeFloat(CString str) { str.Format( _T("%.2f"), _tstof( str)); return str; }
[ Dieser Beitrag wurde am 22.10.2002 um 11:27 Uhr von RenéG editiert. ]
-
Hallo RenéG (und auch die vielen anderen!),
auch Dir vielen Dank. Jedoch fange ich langsam an, meinen Computer ...
error C2065: '_tstof' : undeclared identifier
???
Auch habe ich _tstof nicht in der MSDN gefunden.
Bin ich ... oder meine PC ... oder meine Entwickungsumgebung ???
Ich will doch nur eine Funktion schreiebn, die einen CString entgegennimmt, daraus eine Double oder einen Float macht, und diesen dann als CString zurückgibt.
Wenn das alles nichts hilft oder nicht funktioniert, dann muss ich wohl jedes Zeichen überprüfen, ...
Danke.
Gruß Walter
-
Schwachsinn was ihr da macht.
Ihr übergebt einen CString, wandelt ihn in float um und gebt den
CString zurück...
Was für einen Sinn macht dass ???Devil
-
Kein Schwachsinn.
Ich lese aus mehreren CEdit ein. Die Daten werden dann durch Trenner verknüpft, und in eine Textdatei geschrieben.
h;5;1,5;h;7; etc.
Ein anderes Programm list diese Daten dann wieder ein und schreibt sie in eine Datenbank. Ich muss darauf achten, dass der Textstring richtig formatiert ist, also auch an den entsprechenden Positionen ein Datentyp Integer oder Double erscheint. Da die CEdit als Style nur ES_NUMBER hat, aber nichts für Gleitkommazahlen, muss ich die Gleitkommazahlen selbst kontrollieren.
Ich dachte, dass es das einfachste ist, wenn ich den String in einen Double umwandle, und dann einen String zurückgebe.
Gruß Walter
-
ich glaube wohl kaum das atof dir die zahlen aus einem String rausschneidet,
du kannst doch gleich float eingeben lassen in die Editboxen, und dann
float in CString umwandeln...Devil
-
Da die CEdit-Boxen dynamisch erstellt werden, und der Inhalt mit
GetDlgItemText(IDC_E1B,GetDlgInhalt);
ausgelesen wird (es kann vorkommen, dass die CEdit-Box nicht gebraucht wird, und dann ein Date- und Time-Picker erscheint, oder sogar einen Combobox), weiß ich selbst nicht wie das gehen sollte?
Das Problem udn der Vortzeil der Erfassungsmaske ist, dass die Form, Felder und Boxen, welche erscheinen (incl. Anzahl) durch eine Textdatei vorgegeben wird. So kann für jeden Verwendungszweck ein eigenes Formular erstellt werden.
Gruß Walter
-
aber wie willst du es machen das der Anwender nur zahlen + . eingibt?
Devil
-
Der Anwender kann alles eingeben, und ich muss sicherstellen, dass nur das richtige weitergeleitet wird. Bei Integer tu ich mich leicht, da kann ich bei CEdit bei Create ES_NUMBER angeben, aber Gleitkommazahlen kennt CEdit nicht, also muss ich das abfangen. Es gibt auch Kommentarfelder, oder Datums- bzw. Zeitfelder.
Das Problem besteht darin, den DAU daran zu hindern, Falsches zu übermitteln, obwohl er weiß, dass es falsch ist (oder gerade deshalb).
-
Reagier auf das Ereignis EN_CHANGE und ruf folgendes dort auf:
UpdateData(TRUE);
m_strEdit = m_strEdit.SpanIncluding("01234567890-.");
UpdateData(FALSE);Dann hast du alle Zeichen außer den hier genannten wider raus.. also sobald jemand was anderes als die Paar zeichen eingibt, wird es sofort wieder gelöscht.. er sieht es nicht mal erscheinen, als wärs komplett für die Eingabe gesperrt.
-
Hallo DerGhost,
aber wie mache ich das, wenn ich das Objekt dynamisch erstelle?
pmyEdit1b = new CEdit(); pmyEdit1b->Create( WS_CHILD | WS_VISIBLE | WS_BORDER |WS_TABSTOP, CRect(left2,top,right2,bot), this, IDC_E1B); SetDlgItemText(IDC_E1B,ARRInhalt[0]); //mit GetDlgItemText(IDC_E1B,GetDlgInhalt) lese ich wieder aus, ...
Vielen Dank!
Gruß Walter
-
Achso ja...
aber du kannst mal versuchen, den Text per GetDlgItemText in nen CString zu holen, dann per SpanIncluding zu bearbeiten, und per SetDlgItemText zurückzuschreiben.. probiers mal.