Standardfunktion String to Double?



  • Guten Tag!

    Ich hab hier ein großes Problem! 😉

    Ich hab eine Variable mit einem string als Inhalt.

    Diesen Inhalt hätte ich gerne als einen Double-Wert umkonvertiert.

    Also String zu Double.

    Gibt es da irgendeine gute Funktion für, die standardmäßig bei C++ dabei ist?

    Außerdem soll diese Funktion auch gleich abschecken, ob der String überhaupt für ein Double Wert in Frage kommt. Sprich eine Fehlermeldung zurückgeben, wenn es nicht konvertiert werden kann. Außerdem soll die Funktion nicht einfach willkürlich ab oder aufrunden, sondern den String genau so wie er ist(falls er gültig ist) in Double umkonvertieren.

    Gruß skontox



  • Für standardmäßig dabei helfen Dir vielleicht die stringstreams (siehe FAQ).
    Wenn es auch in einer voll portablen externen Library drin sein darf, kann ich boost empfehlen (www.boost.org).

    boost::lexical_cast kann sowas:

    double x = lexical_cast<double>("23.5");
    

    Und die Sache ist erledigt.
    Wenn die Umwandlung nicht gelingt, dann fliegt ne Exception (bad_lexical_cast oder so ähnlich, wenn ich mich richtig erinnere, steht aber alles in der Doku).

    MfG Jester



  • Alternativ gibt es noch std::strtod aus <cstdlib>, aber das ist auch nicht viel handlicher als stringstreams zu benutzen.



  • Herzlichen Dank Euch beiden.
    Das Forum ist echt super!

    Gruß skontox



  • Guten Morgen!

    Ich hab das ertsmal mit stringstreams probiert und bin enttäuscht!
    Kann ich also nicht weiterempfehlen!

    Er hat folgende Probleme:

    1.)

    aus
    string: 1,1
    wird
    double: 1
    
    -> Er erkennt hier nicht den Fehler, dass ich ein Komma in dem string habe.
    Er schneidet das Komma +Zusatz einfach ab. Also völliger Blödsinn.
    Er sollte mir hier eigentlich einen Fehler zurückliefern oder am besten gar nix.
    

    2.)

    aus
    string: 1.888888
    wird
    double: 1.88889
    
    -> Er rundet einfach auf. Ist ja bei manchen Sachen auch OK. Aber ich möchte das nicht. Er soll den Wert so interpretieren wie er ist, ansonsten eine Fehlermeldung oder gar nix zurückliefern.
    

    3.)

    aus
    string: 1.A
    wird
    double: 1
    
    ->Also das ist schon richtig schlecht! Hier muß er auf jeden Fall meckern.
    Naja! ;-(
    

    Jetzt werde ich mich wohl mal an den anderen Möglichkeiten orientieren.
    Ich hoff die sind besser!

    Gruß skontox



  • Es gibt da die C-Funktion sscanf, die sowas auch recht zuverlässig erledigt.
    Du brauchst als erstes einen reservierten Spiecherbereich aus chars (also nen char-array). Dann gibst du als Quelle den String an, in dem die double Zahl steht. Schließlich kannst du dann in verschiedenen Formaten einlesen:

    float dieZahl;
    sscanf("23.5421", "%f", &dieZahl);
    

    Ich habe das hier mit float gemacht. Ich weiß gerade nicht, wie das mit double-Zahlen geht (keine Referenz in greifbarer Nähe)...



  • Und wie löst das seine Probleme? Da sscanf als C-Funktion keine Exception wirft und du keinen Rückgabewert überprüfst, ist das dasselbe wie die stringstream-Lösung, nur mit einer etwas dickeren Staubschicht drauf.

    Ich empfehle boost::lexical_cast<> von www.boost.org. Das ist in etwa die stringstream-Lösung mit Fehlerüberprüfung. Und jetzt keine faulen "Ich habe eine Allergie gegen sauber geschriebene, externe Bibliotheken"-Ausreden! 😉



  • operator void schrieb:

    Und jetzt keine faulen "Ich habe eine Allergie gegen sauber geschriebene, externe Bibliotheken"-Ausreden! 😉

    OK ich bin ja schon ruhig 😉



  • Trotzdem nochmal Danke!
    Boost hab ich zwar heruntergeladen und auch irgendwie mit dem bJam-Tool installieren können, aber ich kann es doch nicht richtig einbinden.
    Wahrscheinlich doch nicht richtig installiert. Das ist aber auch kompliziert gemacht die Installation.

    Naja vielleicht bekomme ich das doch noch irgendwie hin! 😢

    Gruß skontox



  • Für lexical_cast mußt Du eigentlich garnichts übersetzen. Du mußt einfach nur ein

    #include <boost/lexical_cast.hpp>

    in Deinen Source einfügen.
    Wobei Dein boost-Verzeichnis in Deinem Include-Path eingetragen sein sollte.
    Denk auch daran, daß lexical_cast im namespace boost drin ist.

    MfG Jester



  • gibt es da nicht eine funktion die irgendwie:

    atod()
    

    nicht oder????



  • Das mit dem bJam hab ich bis heute nicht gerafft. Ich hab das Ding entzippt, zwei include-Paths gesetzt und benutzt. 😃
    Wird schon mal irgendwann irgendwas nicht funktionieren. 🙄



  • Also ich habe mit

    char *rest;
    double d = strtod("123.456abc", &rest);
    

    sehr gute Erfahrung gemacht. In rest steht jetzt abc. Damit kann ich abfragen, ob die Zahl korreckt ist.
    Aufrunden tut er glaube ich bei mir auch nicht 😉

    Gruß



  • strtod returns 0 if no conversion can be performed or an underflow occurs

    Hmmmm, halte ich auch nicht für besonders geschickt. 😉


Anmelden zum Antworten