Câu trả lời:
Với những điều sau đây,
#include <iomanip>
#include <iostream>
int main()
{
std::cout << std::setfill('0') << std::setw(5) << 25;
}
đầu ra sẽ là
00025
setfill
được đặt thành ký tự khoảng trắng ( ' '
) theo mặc định. setw
đặt chiều rộng của trường sẽ được in và đó là trường.
Nếu bạn quan tâm đến việc biết cách định dạng các luồng đầu ra nói chung, tôi đã viết một câu trả lời cho một câu hỏi khác, hy vọng nó hữu ích: Định dạng đầu ra Bảng điều khiển C ++.
char* or char[]
) không trực tiếp đến bàn điều khiển. Trên thực tế tôi đang viết một hàm trả về chuỗi được định dạng
<iostream>
và <iomanip>
ở đầu tệp của bạn và bạn sẽ cần phải viết using namespace std;
, nhưng đó là cách thực hành tồi nên có lẽ thay vào đó bạn nên đặt tiền tố cho ba định danh trong câu trả lời này std::
.
Một cách khác để đạt được điều này là sử dụng printf()
chức năng cũ của ngôn ngữ C
Bạn có thể sử dụng như thế này
int dd = 1, mm = 9, yy = 1;
printf("%02d - %02d - %04d", mm, dd, yy);
Điều này sẽ in 09 - 01 - 0001
trên bàn điều khiển.
Bạn cũng có thể sử dụng một chức năng khác sprintf()
để ghi đầu ra được định dạng vào một chuỗi như dưới đây:
int dd = 1, mm = 9, yy = 1;
char s[25];
sprintf(s, "%02d - %02d - %04d", mm, dd, yy);
cout << s;
Đừng quên bao gồm stdio.h
tệp tiêu đề trong chương trình của bạn cho cả hai chức năng này
Bạn có thể điền vào chỗ trống bằng 0 hoặc bằng char khác (không phải số).
Nếu bạn viết một cái gì đó giống như %24d
định dạng định dạng thì điều này sẽ không điền vào chỗ 2
trống. Điều này sẽ đặt pad thành 24
và sẽ lấp đầy khoảng trống.
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
Điều này tạo ra đầu ra:
-12345
****-12345
-12345****
****-12345
-****12345
cout.fill( '0' );
cout.width( 3 );
cout << value;
char* or char[]
) không trực tiếp đến bàn điều khiển. Trên thực tế tôi đang viết một hàm trả về chuỗi được định dạng
std::stringstream
.
sprintf(s, "%02d-%02d-%04d", dd, mm, yy);
nơi s
là char*
và dd, mm, yy
là của int
loại. Điều này sẽ viết 02-02-1999
định dạng theo các giá trị trong các biến.
Tôi sẽ sử dụng các chức năng sau đây. Tôi không thích sprintf
; nó không làm những gì tôi muốn !!
#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;
}
Một ví dụ khác để xuất ngày và thời gian bằng cách sử dụng số 0 làm ký tự điền vào các trường hợp của các giá trị chữ số đơn: 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;
}