322 votes

Comment puis-je remplir un int avec des zéros de tête lorsque j'utilise l'opérateur cout << ?

Je veux cout pour sortir un int avec des zéros en tête, donc la valeur 1 serait imprimé comme 001 et la valeur 25 imprimé en tant que 025 . Comment puis-je faire ?

483voto

AraK Points 38702

Avec les éléments suivants,

#include <iomanip>
#include <iostream>

int main()
{
    std::cout << std::setfill('0') << std::setw(5) << 25;
}

la sortie sera

00025

setfill est défini comme le caractère espace ( ' ' ) par défaut. setw définit la largeur du champ à imprimer, et c'est tout.


Si vous souhaitez savoir comment formater les flux de sortie en général, j'ai écrit une réponse pour une autre question, j'espère qu'elle vous sera utile : Formatage de la sortie console C++.

6 votes

Mais comment puis-je écrire une sortie formatée dans une chaîne de caractères ( char* or char[] ) pas à la console directement. En fait, j'écris une fonction qui renvoie une chaîne de caractères formatée.

19 votes

@harsh use std::stringstream

10 votes

N'oubliez pas de restaurer le format du flux après avoir fait cela ou vous aurez une mauvaise surprise plus tard.

57voto

shashwat Points 2309

Une autre façon d'y parvenir est d'utiliser l'ancien printf() fonction du langage C

Vous pouvez l'utiliser comme suit

int dd = 1, mm = 9, yy = 1;
printf("%02d - %02d - %04d", mm, dd, yy);

Ceci imprimera 09 - 01 - 0001 sur la console.

Vous pouvez également utiliser une autre fonction sprintf() pour écrire une sortie formatée dans une chaîne de caractères comme ci-dessous :

int dd = 1, mm = 9, yy = 1;
char s[25];
sprintf(s, "%02d - %02d - %04d", mm, dd, yy);
cout << s;

N'oubliez pas d'inclure stdio.h fichier d'en-tête dans votre programme pour ces deux fonctions

Chose à noter :

Vous pouvez remplir les espaces vides soit par 0, soit par un autre caractère (pas un numéro).
Si vous écrivez quelque chose comme %24d que cela ne remplira pas 2 dans les espaces vides. Le tampon sera ainsi réglé sur 24 et remplit les espaces vides.

13 votes

Je sais qu'il s'agit d'une vieille réponse, mais il faut tout de même souligner que sprintf ne doit généralement pas être trop fiable puisque vous ne pouvez pas spécifier la longueur du tampon dans lequel il est censé écrire. L'utilisation de snprintf est généralement plus sûre. L'utilisation de streams par opposition à *printf() est également beaucoup plus sûre du point de vue des types car le compilateur a la possibilité de vérifier les types des paramètres au moment de la compilation ; la réponse acceptée par AraK est à la fois sûre du point de vue des types et C++ "standard", et elle ne repose pas sur des en-têtes qui empoisonnent l'espace de noms global.

0 votes

La réponse se trouve dans l'exemple du formatage des dates. Notez cependant qu'elle utilise un format d'heure exotique comme exemple, même s'il semble similaire à ISO_8601 en surface ( fr.wikipedia.org/wiki/ISO_8601 ).

43voto

quest333 Points 369
cout.fill('*');
cout << -12345 << endl; // print default value with no field width
cout << setw(10) << -12345 << endl; // print default with field width
cout << setw(10) << left << -12345 << endl; // print left justified
cout << setw(10) << right << -12345 << endl; // print right justified
cout << setw(10) << internal << -12345 << endl; // print internally justified

Cela produit la sortie :

-12345
****-12345
-12345****
****-12345
-****12345

32voto

vitaut Points 10255

En C++20 vous serez capable de faire :

std::cout << std::format("{:03}", 25); // prints 025

En attendant, vous pouvez utiliser la bibliothèque {fmt} , std::format est basé sur.

Avis de non-responsabilité : Je suis l'auteur de {fmt} et de C++20 std::format .

0 votes

Si j'ai bien compris, aucun compilateur ne le supporte actuellement ? Source : fr.cppreference.com/w/cpp/20

2 votes

@jlh, il s'agit d'une bibliothèque, pas d'une fonctionnalité du compilateur, mais sinon vous avez raison : std::format n'est pas encore supporté par les implémentations de la bibliothèque standard (C++20 n'a été publié que récemment). Je sais que libc++ et Microsoft y travaillent.

3 votes

Félicitations pour l'intégration de votre bibliothèque dans C++20 ! Je l'ai utilisée pour la première fois il y a de nombreuses années.

18voto

lyricat Points 1480
cout.fill( '0' );    
cout.width( 3 );
cout << value;

0 votes

Mais comment puis-je écrire une sortie formatée dans une chaîne de caractères ( char* or char[] ) pas à la console directement. En fait, j'écris une fonction qui renvoie une chaîne de caractères formatée.

2 votes

@Shashwat Tripathi utilise std::stringstream .

0 votes

@AraK Je pense que cela ne fonctionnerait pas dans Turbo C++. Je l'ai utilisé en utilisant sprintf(s, "%02d-%02d-%04d", dd, mm, yy);s est char* et dd, mm, yy sont de int type. Cela permet d'écrire 02-02-1999 format en fonction des valeurs des variables.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X