Methode zur (speziellen) formatierten Ausgabe für (std::string-)Streams ...



  • Hali halo 🙂 ,
    Ich habe folgendes Problem:
    Ich möchte eine Variable vom Typ long double in einen std::stringstream schreiben, allerdings so, dass die Zahlenwerte eine bestimmte Anzahl nicht überschreiten, Beispiel:

    long double value = 12.34576;
    std::stringstream stream;
    stream /* << setXXX(...) */ << value;
    

    Dieser Wert (12.34576) soll allerdings maximal 5 Stellen lang sein, also in diesem Beispiel als "12.345" ausgegeben werden. D.h., wenn die Zahl in 'value' beispielsweise 456,1235 wäre, sollte er daraus machen: "456,12".

    Hoffe ihr versteht, was ich meine 🙄 . Schonmal danke 👍 !

    PS: Habs schon mit std::fixed, std::setprecision und std::setw ausprobiert, aber irgendwie war das Ergebnis nicht zufriedenstellend.



  • Hallo
    die folgende Funktion verwendet einen ostringstream für diese Problemstellung:

    string zahlToString(double d, unsigned int weite,
            unsigned int format,  // 0: fix, 1: scientific
                                  // sonst: automatisch
            unsigned int anzahlNachkommastellen )  {// nur Format 0/1
      ostringstream wandler;
      if(format == 0) {
         wandler.setf(ios::fixed, ios::floatfield);
         if(anzahlNachkommastellen > 0)
             wandler.setf(ios::showpoint);
      }
      else {
         if(format == 1)
            wandler.setf(ios::scientific, ios::floatfield);
      }
    
      if(format == 0 || format == 1)
         wandler.precision(anzahlNachkommastellen);
      if(weite > 0)
         wandler.width(weite);
      // Zahl und abschließendes Nullzeichen in den Strom einfügen
      wandler << d << ends;
      return wandler.str();
    }
    

    Man sieht auch, welche ios-Parameter gesetzt werden. Die Funktion kann für integer-Typen überladen werden:

    string zahlToString(long i, unsigned int weite) {
       return zahlToString(static_cast<double>(i), weite, 0, 0);
    }
    string zahlToString(int i, unsigned int weite) {
       return zahlToString(static_cast<double>(i), weite, 0, 0);
    }
    string zahlToString(unsigned long i, unsigned int weite) {
       return zahlToString(static_cast<double>(i), weite, 0, 0);
    }
    string zahlToString(unsigned int i, unsigned int weite) {
       return zahlToString(static_cast<double>(i), weite, 0, 0);
    }
    


  • Nachtrag: std:: fehlt ggf noch, using namespace std; war vorausgesetzt.


Anmelden zum Antworten