I want cout
to output an int with leading zeros, so the value 1
would be printed as 001
and the value 25
printed as 025
. How can I do this?
问题:
回答1:
First include <iomanip>
, then:
cout << setfill(\'0\') << setw(5) << 25;
output:
00025
setfill
is set to space \' \'
by default. setw
sets the width of the field to be printed, and that\'s it.
If you are interested in knowing how the to format output streams in general, I wrote an answer for another question, hope it is useful: Formatting C++ Console Output.
回答2:
Another way to achieve this is using old printf()
function of C language
You can use this like
int dd = 1, mm = 9, yy = 1;
printf(\"%02d - %02d - %04d\", mm, dd, yy);
This will print 09 - 01 - 0001
on the console.
You can also use another function sprintf()
to write formatted output to a string like below:
int dd = 1, mm = 9, yy = 1;
char s[25];
sprintf(s, \"%02d - %02d - %04d\", mm, dd, yy);
cout << s;
Don\'t forget to include stdio.h
header file in your program for both of these functions
Thing to be noted:
You can fill blank space either by 0 or by another char (not number).
If you do write something like %24d
format specifier than this will not fill 2
in blank spaces. This will set pad to 24
and will fill blank spaces.
回答3:
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
This produces the output:
-12345
****-12345
-12345****
****-12345
-****12345
回答4:
cout.fill( \'0\' );
cout.width( 3 );
cout << value;
回答5:
I would use the following function. I don\'t like sprintf
; it doesn\'t do what I want!!
#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;
}
回答6:
Another example to output date and time using zero as a fill character on instances of single digit values: 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;
}