double auf direktem Weg in string <string> convertieren



  • Hi
    Ich habe: 🙂
    #include <string>
    using namespace std;
    double Zahl = 12.345;
    string Str;

    Ich möchte:

    Die Zahl 12.345 direkt in den String Str konvertieren. 😕
    Wie geht das? Geht das überhaupt.

    Die lösungsvorschläge die man in Google findet funktionieren nicht, oder sind so kompliziert erklärt, dass keiner nachkommt.
    In der FAQ finde ich auch nichts passendes.

    Mit freundlichen Grüssen!





  • Hi

    Was mich irritiert, ist:
    Wenn ich das ganze so schreibe funktioniert es!

    #include <sstream> 
    #include <string> 
    #include <iostream> 
    using namespace std; 
    int main() 
    {
        double d = 0.0; 
        ostringstream Str; 
        Str << d; 
        string ZahlAlsString(Str.str()); //<- Variable wird hier deklariert
        cout << ZahlAlsString << endl;
        return 0;
    }
    

    Doch wenn ich es so schreibe funktioniert es nicht!!

    #include <sstream> 
    #include <string> 
    #include <iostream> 
    using namespace std; 
    int main() 
    {
        string ZahlAlsString; // <- Variable wird hier deklariert
        double d = 0.0; 
        ostringstream Str; 
        Str << d; 
        ZahlAlsString(Str.str());
        cout << ZahlAlsString << endl;
    	return 0;
    }
    

    Sollte meiner Ansicht nach das Gleiche sein?

    So bekomme ich immer beim Compilieren die Fehlermeldung:
    error C2064: Ausdruck ergibt keine Funktion.

    Ich muss die Variable vorher definieren, denn sie hat ja vor diesem Aufruf auch schon Ihre Aufgaben und soll dann mit dem Zahlenwert (als String) initialisiert werden.

    Mit freundlichen Grüssen!



  • Unten schreibst Du etwas, was wie ein normaler Funktionsaufruf aussieht, aber keiner ist, daher der Fehler.
    Beim oberen Beispiel hingegen übergibst Du Str.str() an den Konstruktor des Strings. Das ist was anderes.
    Lösung: Schreib einfach ZahlAlsString = Str.str();.



  • Hi
    Danke erst mal. Das ganze funktioniert. 🙂

    Doch wenn ich das Ostringstream - Objekt ein zweites mal verwende, ist noch immer der erste Eintrag drin und der zweite Eintrag wird einfach dazu adiert.
    Der string wird somit immer länger.😕
    Wie leere ich das Ostringstream - Objekt Str, so dass beim zweiten und x'ten mal nur der soeben eingelesene Stream drin ist?

    Mit freundlichen Grüssen!



  • Ich leg mir immer ne eigene Funktion StrToDouble oder was auch immer an. Dann wird automatisch bei jedem Funktionsaufruf ein neues ostringstream-Objekt angelegt (vorausgesetzt du deklarierste es nicht als static).



  • Hi
    Diese umwandlung, funktioniert nur mit Zahlen, die Maximal 6 Ziffer und ein Dezimalpunkt haben oder maximal 7 Ziffern. Wenn es mehr Zeichen zum übertragen gibt, werden alle weiteren Zeichen einfach abgerundet nicht abgeschnitten. Der String wird also maximal 7 Zeichen lang. 😕

    Das ist natürlich nicht brauchbar.

    Hat das schon mal jemand festgestellt?

    Mit freundlichen Grüssen 🙂



  • Hallo,

    das Problem kannst du so lösen:

    Str.precision(10);
    

    Natürlich ist auch da bald Schluss, da Double keiner größeren Werte aufnehmen kann. Aber zumindest dafür reicht das aus.



  • warum macht ihr nicht einfach...

    char* DoubleToString(double Value, int Precision)
    {
      char *Number = new char[25];
    
      memset(Number, '\0', 25);
      gcvt(Value, Precision + 1, Number);
    
      return Number;
    }
    


  • Sunday schrieb:

    warum macht ihr nicht einfach...

    char* DoubleToString(double Value, int Precision)
    {
      char *Number = new char[25];
      
      memset(Number, '\0', 25);
      gcvt(Value, Precision + 1, Number);
      
      return Number;
    }
    

    Z.B. weil gcvt keine Standardfunktion ist.



  • Hi

    Natürlich hab ich das Problem gelöst, indem ich zuerst mit sprintf() einen char-String erzeuge und ihn dann nach string convertiere. Nur nähme mich wunder ob es nicht eine brauchbare Lösung gäbe, damit man nicht zwei Funktionen damit bemühen müsste. Doch ich habe bemerkt, dass das so wie es ausschaut gar nicht so einfach ist. Schade!! 😞
    Also ein echtes Problem habe ich nicht damit.

    Danke für Eure Mühe. 🙂

    Mit freundlichen Grüssen!


Anmelden zum Antworten