web-dev-qa-db-fra.com

Imprimer les zéros non significatifs avec l'opérateur de sortie C ++?

Comment puis-je formater ma sortie en C++? En d'autres termes, quel est l'équivalent C++ de l'utilisation de printf comme ceci:

printf("%05d", zipCode);

Je sais que je pourrais simplement utiliser printf en C++, mais je préférerais l'opérateur de sortie <<.

Pourriez-vous simplement utiliser ce qui suit?

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

Cela fera l'affaire, au moins pour les nombres non négatifs(une) comme les codes postauxb) mentionné dans votre question.

#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;

Les manipulateurs IO les plus courants qui contrôlent le remplissage sont:

  • std::setw(width) définit la largeur du champ.
  • std::setfill(fillchar) définit le caractère de remplissage.
  • std::setiosflags(align) définit l'alignement, où align est ios :: left ou ios :: right.

Et juste sur votre préférence pour l'utilisation de <<, Je vous suggère fortement de regarder dans la bibliothèque fmt. Cela a été un excellent ajout à notre boîte à outils pour formater des trucs et est beaucoup plus agréable que les pipelines de flux de longueur massive, vous permettant de faire des choses comme:

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

Et il est actuellement ciblé par LEWG vers C++ 20 également, ce qui signifie qu'il devrait être une partie de base du langage à ce stade (ou presque certainement plus tard s'il ne se faufile pas tout à fait).


(une) Si vous ne devez gérer des nombres négatifs, vous pouvez utiliser std::internal Comme suit:

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

Cela place le caractère de remplissage entre le signe et la magnitude.


b) Ceci ("tous les codes postaux ne sont pas négatifs") est une supposition de ma part mais raisonnablement sûre, je garantis :-)

82
paxdiablo

Utilisez les appels setw et setfill :

std::cout << std::setw(5) << std::setfill('0') << zipCode << std::endl;
9
Nik Reiman
cout << setw(4) << setfill('0') << n << endl;

de:

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

4
anthony

ou,

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

affichera 00001 comme l'OP voulait déjà le faire

1
Jason Newland