C++ Wissenschaftliche Schreibweise



  • Hallo,

    ich bin neu hier und habe direkt eine Frage.
    Für ein kleines Projekt möchte ich mit einem C++ Programm Daten per TCP an eine SPS senden. Soweit funktioniert auch alles super. Jedoch habe ich noch eine Frage, um float-Werte zu meiner SPS zu schicken, muss ich diese in bestimmtes Format bringen und in einen String umwandeln. Der String sollte dabei 14 Byte lang sein und in wissenschaftlicher Schreibweise dargestellt sein (also so: +V.NNNNNNNE+XX; + = Vorzeichen kann auch negativ sein; V = Vorkommastelle; N = Nachkommastelle; X = Exponentenstellen). Wenn ich in C++ aber eine Zahl vom Format float/double in die wissenschaftliche Schreibweise umwandle, erhalte ich einen String mit einer Länge von nur 11 Byte und ohne Vorzeichen. Für einen schnellen Go-Around fülle ich meinen String momentan einfach noch mit einem entsprechenden Vorzeichen und ein paar Nullen vor dem Exponenten.
    Daher meine Frage, gibt es eine Funktion, mit der ich eine Zahl im double/float Format in einen String mit dem oben genannte 14 Byte Schema bekomme?

    Um eine Zahl in einen String umzuwandeln verwende ich folgenden Code:

     double number = 312324654832.313;
        ostringstream streamnumber;													
        streamnumber << number;													
        string fltstring = streamnumber.str();
        cout << fltstring << endl;
    

    Dieser Code liefert dann die Ausgabe: 3.12325e+11
    Leider auch ohne Vorzeichen.

    Schönen Sonntag wünsche ich euch 🙂

    Liebe Gruße WillyH



  • Dafür gibt es sog. Stream-Manipulatoren, u.a. showpos sowie setw und setprecision:

    streamnumber << scientific << showpos << setw(14) << setprecision(7) << number;
    

    Ähnliches bietet auch sprintf:

    sprintf(buffer, "%+14.7e", number);
    

    (wobei die 14 auch nur eine minimum field width ist und keine exakte Gesamtlänge angibt)
    s.a. Ideone-Code

    Edit: Evtl. helfen auch Boost::Format oder {fmt}.


Log in to reply