Supervised string2float - atof() !?



  • Hallo Leute,

    habe mal eine Frage zur funktion atof().

    Es heißt [1], die Funktion stoppt die Konvertierung ab den ersten Zeichen dass sie nicht "versteht".
    "Verstehen" tut sie:

    [whitespace] [sign] [digits] [.digits] [ {d | D | e | E }[sign]digits
    

    .

    Soweit sogut.
    Kann ich eine Art exception abfangen, falls solcher Fall eintritt!?

    Bsp:

    string *bla = new string("+80.2.245");
    	double d;
    
    	d = atof( bla->c_str() );
    	cout << d << endl;
    
    	delete bla;
    

    Liebn Gruß,
    derJan.

    PS: Ist eine casting-funktion von c++ für solche Zwecke vllt sinvoller? Das ergebnis von atof() et al. gefällt mir aber 😉



  • Hallo,

    Hast du dir diesen FAQ-Beitrag mal durchgelesen?
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39488.html
    Warum erstellst du den string überhaupt dynamisch?


  • Administrator

    Ergänzung:
    Wenn du dann auf C++ Streams umstellst, dann kannst du dir auch Exceptions zuwerfen lassen, wenn du dies mit der folgenden Funktion aktivierst (ist leider nicht per Default an):
    http://www.cplusplus.com/reference/iostream/ios/exceptions/

    Grüssli



  • atof() liefert im Fehlerfall eine 0 zurück, also eigentlich totaler Käse, es sei denn du hast vorher schon sichergestellt, dass atof() einen gültigen Eingabestring erhält. Dagegen muss man ganz klar halten, dass atof() verdammt schnell ist, da können boost::lexical_cast bzw. die IOStreams nicht mithalten.



  • 👍 Das ging ja flott! 👍

    Danke für den passenden FAQ-Link.*rotwerd*
    Habs nun folgendermaßen gelöst:

    string bla = "+8023.k";
    	double d;
    	char * pEnd = 0;
    
    	d = strtod(bla.c_str(), &pEnd);
    	cout << "in  : " << bla << endl
    		<< "out : " << d << endl;
    	if(strlen(pEnd)>0)
    	cout << "don't understand: \"" << pEnd << "\"" 
    		<< " at position: " <<bla.size()-strlen(pEnd) << endl;
    

    -----

    @Tippgeber:

    atof() liefert im Fehlerfall eine 0 zurück, also eigentlich totaler Käse,[..]

    ➡ genau das 😉
    -----

    @Dravere:

    Wenn du dann auf C++ Streams umstellst, dann kannst du dir auch Exceptions zuwerfen lassen, wenn du dies mit der folgenden Funktion aktivierst (ist leider nicht per Default an)

    ➡ Hatte beim schnellen Probieren net so geklappt!? Neja, hatte da auchschon ne Lösung...Vllt kennste das mit der Motivation 🙄 Aber wenn du ohne größeren Aufwand eine analoge Lösung parat hast, wär das net schlecht;)
    ------

    Nochmal vielen Dank für die flotten Antworten!
    Freundlichste Grüße,
    derJan


Log in to reply