88 Stimmen

Führende Nullen mit C++-Ausgabeoperator drucken?

Wie kann ich meine Ausgabe in C++ formatieren? Mit anderen Worten, was ist das C++-Äquivalent zur Verwendung von printf wie diese:

printf("%05d", zipCode);

Ich weiß, ich könnte einfach die printf in C++, aber ich würde den Ausgabeoperator << .

Würden Sie einfach das Folgende verwenden?

std::cout << "ZIP code: " << sprintf("%05d", zipCode) << std::endl;

122voto

paxdiablo Punkte 809679

Zumindest für nicht-negative Zahlen funktioniert das so (a) wie zum Beispiel die Postleitzahlen (b) die Sie in Ihrer Frage erwähnt haben.

#include <iostream>
#include <iomanip>

using namespace std;
cout << setw(5) << setfill('0') << zipCode << endl;

// or use this if you don't like 'using namespace std;'
std::cout << std::setw(5) << std::setfill('0') << zipCode << std::endl;

Die gebräuchlichsten IO-Manipulatoren, die das Auffüllen kontrollieren, sind:

  • std::setw(width) legt die Breite des Feldes fest.
  • std::setfill(fillchar) setzt das Füllzeichen.
  • std::setiosflags(align) legt die Ausrichtung fest, wobei align für ios::left oder ios::right steht.

Und nur über Ihre Vorliebe für die Verwendung von << würde ich Ihnen dringend empfehlen, sich mit dem fmt Bibliothek (siehe https://github.com/fmtlib/fmt ). Dies ist eine großartige Ergänzung zu unserem Toolkit für die Formatierung von Material und ist viel schöner als massiv Länge Stream-Pipelines, so dass Sie Dinge wie tun können:

cout << fmt::format("{:05d}", zipCode);

Und es wird derzeit von der LEWG auch auf C++20 ausgerichtet, was bedeutet, dass es hoffentlich zu diesem Zeitpunkt ein Grundbestandteil der Sprache sein wird (oder fast sicher später, wenn es sich nicht ganz einschleicht).


(a) Wenn Sie tun mit negativen Zahlen umgehen müssen, können Sie std::internal wie folgt:

cout << internal << setw(5) << setfill('0') << zipCode << endl;

Dadurch wird das Füllzeichen zwischen das Vorzeichen und den Betrag.


(b) Dies ("alle Postleitzahlen sind nicht-negativ") ist eine Annahme meinerseits, aber eine ziemlich sichere, würde ich garantieren :-)

2 Stimmen

Beachten Sie, dass Sie auch einfach cout << left o cout << right für die Ausrichtung.

0 Stimmen

Beachten Sie, dass diese Lösung für negative Zahlen NICHT korrekt funktioniert! Der Versuch, "-5" auf diese Weise zu drucken, ergibt: "000-5"

0 Stimmen

Durch Hinzufügen von std::internal wird dieser Code auch für negative Zahlen korrekt.

21voto

vitaut Punkte 42467

In C++20 werden Sie dazu in der Lage sein:

std::cout << std::format("{:05}", zipCode);

In der Zwischenzeit können Sie die {fmt}-Bibliothek , std::format basiert auf.

Haftungsausschluss : Ich bin der Autor von {fmt} und C++20 std::format .

0 Stimmen

Weitere Informationen unter: stackoverflow.com/questions/2342162/

15voto

Nik Reiman Punkte 37385

Verwenden Sie die setw und setfill Anrufe:

std::cout << std::setw(5) << std::setfill('0') << zipCode << std::endl;

0 Stimmen

Re-aktiviert und +1'ed, da es zeigt, wie es in jedem Namespace zu tun (auch hinzugefügt setfill, sqook, hoffe, Sie haben nichts dagegen).

0 Stimmen

Das stimmt. "using namespace std;" ist definitiv böse ;)

1 Stimmen

Ich denke, in dieser Antwort sollte erwähnt werden, dass im Gegensatz zu der Einstellung aus std::setw die Einstellung von std::setfill bleibt nach der Ausgabe erhalten, d. h. das Füllzeichen für std::cout wird dauerhaft geändert (bis zur Änderung durch eine andere std::setfill ). Da es unwahrscheinlich ist, dass dies erwünscht ist, scheint es am besten zu sein, das vorherige Füllzeichen zu speichern und wiederherzustellen.

5voto

anthony Punkte 39130
cout << setw(4) << setfill('0') << n << endl;

von:

http://www.fredosaurus.com/notes-cpp/io/omanipulators.html

2voto

Jason Newland Punkte 441

Oder,

char t[32];
sprintf_s(t, "%05d", 1);

wird 00001 ausgeben, wie es der OP bereits tun wollte

4 Stimmen

Der OP fragte ausdrücklich nach einem Weg, der die << Operator anstelle von (s)printf.

0 Stimmen

@jankes das wäre : std::cout << "Postleitzahl: " <<sprintf_s(t, "%05d", 1)<< endl;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X