2009-11-11 9 views
185

Je veux cout pour sortir un int avec des zéros, donc la valeur 1 serait imprimée comme 001 et la valeur 25 imprimé comme 025 .. vous avez l'idée .. comment puis-je faire cela?Comment est-ce que je peux garnir un int avec les zéros en avant en employant l'opérateur de cout?

Merci.

+1

double possible de [? impression des zéros en tête avec l'opérateur de sortie C (printf équivalent)] (http://stackoverflow.com/questions/530614/prin t-leading-zeros-avec-c-output-operator-printf-equivalent) – atoMerz

Répondre

276

d'abord inclure <iomanip>, puis:

cout << setfill('0') << setw(5) << 25; 

output: 
00025 

setfill est réglé sur space ' ' par défaut. setw définit la largeur du champ à imprimer, et c'est tout.


Si vous êtes intéressé à savoir comment le pour mettre en forme des flux de sortie en général, j'ai écrit une réponse à une autre question, espérons qu'il est utile: Formatting C++ Console Output.

+3

mais comment puis-je écrire une sortie formatée sur une chaîne ('char * ou char []') pour ne pas la console directement.En fait, j'écris une fonction qui retourne la chaîne formatée – shashwat

+8

@harsh use std :: stringstream – cheshirekow

+7

N'oubliez pas de restaurer le format de flux après cela ou vous obtiendrez une mauvaise surprise plus tard. –

17
cout.fill('0');  
cout.width(3); 
cout << value; 
+0

mais .. comment puis-je écrire une sortie formatée à une chaîne ('char * ou char []') de ne pas console directement. En fait, j'écris une fonction qui retourne la chaîne formatée – shashwat

+1

@Shashwat Tripathi Utilisez 'std :: stringstream'. – AraK

+0

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

32

Une autre façon d'y parvenir est en utilisant ancienne printf() fonction du langage C

Vous pouvez utiliser cela comme

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

Ceci affichera 09 - 01 - 0001 sur la console.

Vous pouvez également utiliser une autre fonction sprintf() pour écrire la sortie formatée à une chaîne comme ci-dessous:

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

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

À noter:

Vous pouvez remplir un espace blanc par 0 ou par un autre char (pas de numéro).
Si vous écrivez quelque chose comme %24d spécificateur de format que cela ne remplira pas 2 dans les espaces. Cela définira pad à 24 et remplira les espaces vides.

+5

Je sais que c'est une vieille réponse, mais il faut tout de même souligner que sprintf ne devrait généralement pas trop faire confiance puisque vous ne pouvez pas spécifier la longueur du tampon dans lequel il est censé écrire. Utiliser snprintf a tendance à être plus sûr. L'utilisation de flux par opposition à * printf() est également beaucoup plus sûre car le compilateur a la possibilité de vérifier les types de paramètres au moment de la compilation; La réponse acceptée par AraK est à la fois de type sécurisé et C++ standard, et ne dépend pas des en-têtes qui empoisonnent l'espace de noms global. – Magnus

3

J'utiliserais la fonction suivante. Je n'aime pas sprintf ça ne fait pas ce que je veux !!

#define hexchar(x) ((((x)&0x0F)>9)?((x)+'A'-10):((x)+'0')) 
typedef signed long long Int64; 

// special printf for numbers only 
// see formatting information below 
// Print the number "n" in the given "base" 
// using exactly "numDigits" 
// print +/- if signed flag "isSigned" is TRUE 
// use the character specified in "padchar" to pad extra characters 
// 
// Examples: 
// sprintfNum(pszBuffer, 6, 10, 6, TRUE, ' ', 1234); --> " +1234" 
// sprintfNum(pszBuffer, 6, 10, 6, FALSE, '0', 1234); --> "0" 
// sprintfNum(pszBuffer, 6, 16, 6, FALSE, '.', 0x5AA5); --> "..5AA5" 
void sprintfNum(char *pszBuffer, int size, char base, char numDigits, char isSigned, char padchar, Int64 n) 
{ 
    char *ptr = pszBuffer; 

    if (!pszBuffer) 
    { 
     return; 
    } 

    char *p, buf[32]; 
    unsigned long long x; 
    unsigned char count; 

    // prepare negative number 
    if(isSigned && (n < 0)) 
    { 
     x = -n; 
    } 
    else 
    { 
     x = n; 
    } 

    // setup little string buffer 
    count = (numDigits-1)-(isSigned?1:0); 
    p = buf + sizeof (buf); 
    *--p = '\0'; 

    // force calculation of first digit 
    // (to prevent zero from not printing at all!!!) 
    *--p = (char)hexchar(x%base); 
    x = x/base; 
    // calculate remaining digits 
    while(count--) 
    { 
     if(x != 0) 
     { 
      // calculate next digit 
      *--p = (char)hexchar(x%base); 
      x /= base; 
     } 
     else 
     { 
      // no more digits left, pad out to desired length 
      *--p = padchar; 
     } 
    } 

    // apply signed notation if requested 
    if(isSigned) 
    { 
     if(n < 0) 
     { 
      *--p = '-'; 
     } 
     else if(n > 0) 
     { 
      *--p = '+'; 
     } 
     else 
     { 
      *--p = ' '; 
     } 
    } 

    // print the string right-justified 
    count = numDigits; 
    while(count--) 
    { 
     *ptr++ = *p++; 
    } 

    return; 
} 
23
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 
0

un autre exemple à ce jour de sortie et le temps en utilisant zéro comme un caractère de remplissage sur les instances de valeurs à un seul chiffre: 04/06/2017 18:13 : 02

#include "stdafx.h" 
#include <iostream> 
#include <iomanip> 
#include <ctime> 
using namespace std; 

int main() 
{ 
    time_t t = time(0); // get time now 
    struct tm * now = localtime(&t); 
    cout.fill('0'); 
    cout << (now->tm_year + 1900) << '-' 
     << setw(2) << (now->tm_mon + 1) << '-' 
     << setw(2) << now->tm_mday << ' ' 
     << setw(2) << now->tm_hour << ':' 
     << setw(2) << now->tm_min << ':' 
     << setw(2) << now->tm_sec 
     << endl; 
    return 0; 
}