web-dev-qa-db-fra.com

Comment puis-je compléter un int avec des zéros non significatifs lors de l'utilisation de cout << operator?

Je veux que cout génère un entier avec des zéros, de sorte que la valeur 1 soit imprimée sous la forme 001 et que la valeur 25 soit imprimée sous la forme 025. Comment puis-je faire ceci?

213
jamieQ

Commencez par inclure <iomanip>, puis:

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

output:
00025

setfill est défini sur space ' ' 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 à une autre question, en espérant que cela soit utile: Formatting C++ Console Output.

319
AraK

Une autre méthode consiste à utiliser l’ancienprintf()fonction du langage C

Vous pouvez utiliser ceci comme

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 fonctionsprintf()pour écrire une sortie formatée dans 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;

N'oubliez pas d'inclure le fichierstdio.hdans votre programme pour ces deux fonctions

Chose à noter:

Vous pouvez remplir les espaces vides soit par 0, soit par un autre caractère (pas de numéro).
Si vous écrivez quelque chose comme le spécificateur de format %24d, cela ne remplira pas 2 dans les espaces vides. Ceci définira le pad sur 24 et remplira les espaces vides.

37
shashwat
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
28
quest333
cout.fill( '0' );    
cout.width( 3 );
cout << value;
17
lyricat

Je voudrais utiliser 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);  -->  "001234"
//    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;
    }

    // Set up small 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;
}
3
Thomas J Younsi

Un autre exemple de sortie de la date et de l'heure en utilisant zéro comme caractère de remplissage dans les instances de valeurs à un chiffre: 2017-06-04 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;
}
0
user8163172