Zahlen aus CStrings extrahieren
-
Hallo ich habe einen CSting, z.B.
CString s = "106.912 328.869 -114.73" float x,y,z;
Was ist jetzt der beste Weg um die Zahlen aus s in die floatvariablen einzulesen?
Danke, Jochen
-
An Leerzeichen zerhacken und dann atol & Co verwenden?
-
estartu_de schrieb:
An Leerzeichen zerhacken und dann atol & Co verwenden?
Ja, aber das muss doch besser gehen! oder?
-
Bei CString gibt es keine andere Möglichkeit der Konvertierung. Selbst wenn, könnte nur jeweils ein Wert umgewandelt werden. Es bleibt also nur, den String in drei Teile aufzuteilen und mit atof die doubles zu ermitteln.
-
Hi,
Also die einzelenden doubles musst du dir schon holen, aber ich habe irgendwo eine(zwei) nützliche Methode(n) im Netz entdeckt, die ich auch öfters verwende.double CSpezialFunktionen::CStringToUnsignedDouble(CString csToUnsignedDouble) {/* INPUT : csToUnsignedDouble -> Wert als CString ( egal ob , oder . als Kommata ) OUTPUT : double wert mit .2 nachkommastellen Wenn es keine Zahlen sind wird ein -1 zurückgeliefert */ CString csVormKomma, csNachKomma; int nKomma = -1; double dReturn = -1; nKomma = csToUnsignedDouble.Find('.'); if(nKomma < 0) { nKomma = csToUnsignedDouble.Find(','); if(nKomma < 0) return(IsNumber(csToUnsignedDouble) ? (double)_ttoi((LPCTSTR)csToUnsignedDouble) : -1); } csVormKomma = csToUnsignedDouble.Left(nKomma); csNachKomma = csToUnsignedDouble.Right(csToUnsignedDouble.GetLength()-1-nKomma); if(!IsNumber(csVormKomma) || (!csNachKomma.IsEmpty() && !IsNumber(csNachKomma))) // sind beides nummer? return(-1); dReturn = (double)_ttoi((LPCTSTR)csVormKomma); dReturn += (double)_ttoi((LPCTSTR)csNachKomma) / (double)(pow(10, csNachKomma.GetLength())); return((double)(dReturn * 100) / 100.00f); } /////////////////////////////////////////////////////////////////////////////// /////// Methode ist Nummer //////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// bool CSpezialFunktionen::IsNumber(CString csNumber) { for(int nI = 0; nI < csNumber.GetLength(); nI++) { if(csNumber[nI] > 0x39 || csNumber[nI] < 0x30) return(false); } return(true); }
Diese liefert Dir das double als Rückgabewert
(wenn gültig ist ansonsten ein -1)
hoffe du kannst diese gebrauchen!
Sven
-
Specialguest schrieb:
Hi,
Also die einzelenden doubles musst du dir schon holen, aber ich habe irgendwo eine(zwei) nützliche Methode(n) im Netz entdeckt, die ich auch öfters verwende.Danke, aber da ist meine Lösung ja noch 'n Einzeiler dagegen:
CString S = "1.11 2.33 3.33"; char charString[256]; strcpy(charString, S); char cx[256]; for (int i = 0; charString[i] != ' ' && ... != '\0' ...; i++) cx[i] = charString[i]; float x = atof(cx);
So mach ich's in etwa (Mit den Limits (stringsize < 256 etc.) kann ich leben)
-
die Stringsize ist nicht relevant, da du ja string(2000) schreiben kannst :p