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?
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.
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.h
dans votre programme pour ces deux fonctions
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.
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
cout.fill( '0' );
cout.width( 3 );
cout << value;
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;
}
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;
}