如何在C++中格式化输出?换句话说,如何用C++实现类似于使用 printf
这样的输出格式:
printf("%05d", zipCode);
我知道我可以在C++中使用printf
,但我更喜欢使用输出运算符<<
。你会只使用以下代码吗?
std::cout << "ZIP code: " << sprintf("%05d", zipCode) << std::endl;
如何在C++中格式化输出?换句话说,如何用C++实现类似于使用 printf
这样的输出格式:
printf("%05d", zipCode);
我知道我可以在C++中使用printf
,但我更喜欢使用输出运算符<<
。std::cout << "ZIP code: " << sprintf("%05d", zipCode) << std::endl;
#include <iostream>
#include <iomanip>
using namespace std;
cout << setw(5) << setfill('0') << zipCode << endl;
// or use this if you don't like 'using namespace std;'
std::cout << std::setw(5) << std::setfill('0') << zipCode << std::endl;
控制填充的最常见IO操作符包括:
std::setw(width)
设置字段的宽度。std::setfill(fillchar)
设置填充字符。std::setiosflags(align)
设置对齐方式,其中 align 是 ios::left 或 ios::right。如果您倾向于使用<<
,我强烈建议您了解 fmt
库(请参见https://github.com/fmtlib/fmt)。这是我们格式化工具包的重要组成部分,比大量长度的流管道更加方便,让您可以执行如下操作:
cout << fmt::format("{:05d}", zipCode);
目前,LEWG正在将其定位为C++20的一部分,这意味着它有望成为该语言的基础部分(如果没有被纳入,则几乎肯定会在稍后实现)。
(a) 如果您需要处理负数,可以按以下方式使用std::internal
:
cout << internal << setw(5) << setfill('0') << zipCode << endl;
这将把填充字符放置在符号和数量之间。
(b) 这个(“所有邮政编码都是非负数”)是我自己的假设,但我敢保证是相当安全的 :-)
在C++20中,你可以这样做:
std::cout << std::format("{:05}", zipCode);
在旧系统上,您可以使用{{link1:{fmt}库}},std::format
基于此。
免责声明:我是{fmt}和C++20 std::format
的作者。
使用 setw 和 setfill 函数:
std::cout << std::setw(5) << std::setfill('0') << zipCode << std::endl;
std::setw
的设置不同,std::setfill
的设置将在输出执行后保持不变,换句话说,std::cout
的填充字符将永久更改(直到被另一个std::setfill
修改)。由于这不太可能是理想的,因此最好保存和恢复先前的填充字符。 - Marc van Leeuwencout << setw(4) << setfill('0') << n << endl;
from:
char t[32];
sprintf_s(t, "%05d", 1);
<<
操作符而不是 (s)printf 的方法。 - jankes简单的答案,但它有效!
ostream &operator<<(ostream &os, const Clock &c){
// format the output - if single digit, then needs to be padded with a 0
int hours = c.getHour();
// if hour is 1 digit, then pad with a 0, otherwise just print the hour
(hours < 10) ? os << '0' << hours : os << hours;
return os; // return the stream
}
我正在使用三元操作符,但它可以翻译为if/else语句,如下所示
if(c.hour < 10){
os << '0' << hours;
}
else{
os << hours;
}
cout << left
或cout << right
进行对齐。 - Dan Moulding