lange Zahlen formatiert ausgeben



  • Hallo.

    Ich möchte in C++ lange double Zahlen (zB: 1234567890) mit dezimalem Trennzeichen ausgeben (1.234.567.890).

    Ich habe mir eine Funktion geschrieben, welche die Zahl immer modulo 10 nimmt, das Ergebnis (also die letzte Stelle der Zahl) in ein Array speichert und die Zahl durch 10 ohne Rest teilt.

    Damit hole ich mir also von hinten nach vorne alle Ziffern der Zahl in ein Array. Dieses gebe ich dann Stück für Stück aus und setze immer nach drei Ziffern einen Punkt.

    Soweit so gut. Aber die Methode ist absolut abscheulich.

    Gibt es schon eine Lösung für dieses Problem? Wenn nicht, wie könnte man das eleganter lösen?



  • also eine lösung wäre dann denk ich noch (wenn auch langsam)

    ostringstream str;
    str << zahl;
    string s(str.str());
    for (string::size_type i=0; i<s.length(); ++i) {
        if (!((i+1)%3))
            cout << '.' << s[i];
        else
            cout << s[i];
    }
    

    gibt aber bestimmt auch irgendnen iomanipulator aus <iomanip> den ich nich kenn -.-



  • schreib dir das in eine Funktion und ruf dann immer die Funktion auf



  • Das habe ich ja schon mit meiner Lösung gemacht. Aber wie gesagt: Das ist nicht das Gelbe vom Ei.

    Es muss doch einen anderen Algorithmus geben, als die Zahl aufzutrennen - in ein Array zu speichern - und dann das Array auszugeben...



  • Hallo,
    locales und facets können dir hier helfen. Konkret in diesem Fall das numpunct-facet:

    #include <iostream>
    #include <locale>
    #include <string>
    using namespace std;
    
    class my_punct: public std::numpunct<char>
    {
    public:
    	my_punct(){}
    protected:
        char do_thousands_sep() const {return ',';}
        std::string do_grouping() const {return "\3";}	// 1,000,000
    };
    
    int main()
    {
        locale  loc = cout.getloc();
        locale new_loc(loc,new my_punct);
    
        cout.imbue(new_loc); // use new_loc
    
        cout << fixed << 1000000.0 << endl;
        cout.imbue(loc);
    }
    

    Mehr zum Thema locales und facets findest du hier:
    http://www.tacc.utexas.edu/services/userguides/pgi/pgC++_lib/stdlibug/ug2.htm

    http://www.roguewave.com/support/docs/sourcepro/stdlibref/num-put.html

    Was hier genau passiert, bekommst du hier erklärt:
    http://cpptips.hyperformix.com/cpptips/num_format

    Das Ganze hat nur ein Problem:
    Der Standard definiert nicht eindeutig auf welche Art von Zahlen das Grouping angewendet wird. Einige Library-Bauer haben den Standard so interpretiert, dass Grouping nur bei Integer-Zahlen passiert. Nicht aber für Floating-Poiunt-Zahlen.
    Dank Library Issue 282 ist mittlerweile zwar klar, dass in Standard-C++ grouping auch auf Floating-Poiunt-Zahlen angewendet wird, aber da natürlich noch ältere Bibliotheken verbreitet sind (wie z.B. die Dinkumware-Lib des VC 6), kann es wie gesagt zu Problemen kommen.


Anmelden zum Antworten