printf große Zahlen Tausender-Trennpunkte?
-
Hallo zusammen.
Kann man mit printf oder std::cout eine große Zahl durch Trennpunkte bei Tausendern formatiert ausgeben lassen?Ein geeigneter Modifikator dafür konnte ich nicht finden und meine Lösungen sind hoffnungslos verbuggt.
Vielen Dank für jegliche Hilfe
Johannes Schneider-
-
Wenn du c++ benutzt benutze bitte std::cout.
Ichweiß nicht ob std::cout eine derartige Funktion besitzt, jedoch kann man sie sehr leicht mittels std::string lösen(einfach immer 3 zahlen von hinten abzählen und einen Punkt einfügen)
-
ok ich versuchs mal und poste min Ergebnis. Hat jemand noch nen Kommentar zu dem Thema?
-
Johannes Schneider schrieb:
Hat jemand noch nen Kommentar zu dem Thema?
Hallo Johannes,
das ganze ist ein wenig tricky. Die Default-Einstellung ist, dass keine Tausender-Trenner benutzt werden. Mit der Überladung der 'numeric punctuation facet' geht's:
#include <iostream> #include <locale> class TausenderPunkt : public std::numpunct< char > { protected: char_type do_thousands_sep() const { return '.'; } std::string do_grouping() const { return "\003"; } }; int main() { using namespace std; cout.imbue( locale( cout.getloc(), new TausenderPunkt ) ); cout << int(5.2E+6) << endl; return 0; }
Ausgabe wäre:
5.200.000
Gruß
Werner
-
Was macht denn do_grouping?
-
Kellerautomat schrieb:
Was macht denn do_grouping?
http://www.cplusplus.com/reference/std/locale/numpunct/do_grouping/
-
Hallo Werner,
Ich dachte mir bereits dass das mit Templates geht aber mir war klar dass die Lösung mein Können überschreiten würde.
Von daher: vielen Dank!
-
SeppJ schrieb:
Kellerautomat schrieb:
Was macht denn do_grouping?
http://www.cplusplus.com/reference/std/locale/numpunct/do_grouping/
LOL, wer hat denn das designt?
-
Kellerautomat schrieb:
SeppJ schrieb:
Kellerautomat schrieb:
Was macht denn do_grouping?
http://www.cplusplus.com/reference/std/locale/numpunct/do_grouping/
LOL, wer hat denn das designt?
Das war wohl jemand, der sich überlegt hat, wie man auch die Zahlen in Nepal korrekt mit Tausendertrenner schreiben kann. Lt. Frau Langer schreiben die dort z.B. 10.20.300 für 1Million-20Tausend-300Hundert. Wie hättest Du's gemacht?
Gruß
Werner
-
Für printf gehts mit POSIX und dem Apostroph
#include <stdio.h> #include <locale.h> int main() { setlocale(LC_NUMERIC,"german"); printf("%'lu",1111111111UL); return 0; }
-
Werner Salomon schrieb:
Wie hättest Du's gemacht?
Z.B. vector<unsigned>, aber ein string ist so ziemlich der ungeeignetste Typ ueberhaupt.
-
Kellerautomat schrieb:
Werner Salomon schrieb:
Wie hättest Du's gemacht?
Z.B. vector<unsigned>,
Gab's damals noch nicht.
aber ein string ist so ziemlich der ungeeignetste Typ ueberhaupt.
Ein String ist doch praktisch ein vector<char>.
-
SeppJ schrieb:
Ein String ist doch praktisch ein vector<char>.
Nicht nur, dass char dafuer total unpassend ist (wenns wenigstens signed/unsigned char waere), finde ich, dass ein string mehr ist als ein blosses char[]. Er kann einfach viel mehr, das passt zu einer Zahlengruppierung einfach nicht.
-
Ist für dich ein vector<unsigned> das gleiche wie unsigned[]?
-
Wieso, er hat doch das Gegenteil gesagt?
-
Eisflamme schrieb:
Wieso, er hat doch das Gegenteil gesagt?
Ich habe gesagt, ein String ist praktisch vector<char>, er erwidert, ein String ist viel mehr als char[]. Also char[] == vector<char>?
-
Ah, jetzt versteh ich.
Nunja, er sieht für die Fragestellung aber offensichtlich einen char[] als vector<char> an, weil ein vector<char>/char[] eher "viele Zeichen ohne semantischen Zusammenhang" sind und ein string eben doch der Gesamtkette eher eine Bedeutung zuweist. So verstehe ich das, unterschreiben tue ich aber ohne Anwalt gar nichts.
-
Ein vector ist fuer mich ein verbessertes T[], ja. Und Eisflamme hat's richtig verstanden, ein string gibt dem ganzen eine semantische Bedeutung.