使用C ++输出运算符打印前导零?

时间:2009-02-10 00:00:25

标签: c++ formatting numbers

如何在C ++中格式化输出?换句话说,C ++相当于使用printf这样的东西:

printf("%05d", zipCode);

我知道我可以在C ++中使用printf,但我更喜欢输出运算符<<

您会使用以下内容吗?

std::cout << "ZIP code: " << sprintf("%05d", zipCode) << std::endl;

5 个答案:

答案 0 :(得分:79)

这将解决问题,至少对于非负数(a),例如你问题中提到的邮政编码(b)

#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库。这是我们用于格式化东西的工具包的一个很好的补充,并且比大量长度流管道好得多,允许你做以下事情:

cout << fmt::format("{:05d}", zipCode);

它目前也是LEWG对C ++ 20的目标,这意味着它有望在那时成为该语言的基础部分(或者几乎肯定是后来如果它不会潜入)。


(a)如果你需要处理负数,你可以使用std::internal,如下所示:

cout << internal << setw(5) << setfill('0') << zipCode << endl;

这会将填充字符放在符号和幅度之间。


(b)这(“所有邮政编码都是非负面的”)是我的假设,但是相当安全,我保证: - )

答案 1 :(得分:8)

使用setw and setfill来电:

std::cout << std::setw(5) << std::setfill('0') << zipCode << std::endl;

答案 2 :(得分:4)

cout << setw(4) << setfill('0') << n << endl;

从:

http://www.fredosaurus.com/notes-cpp/io/omanipulators.html

答案 3 :(得分:1)

,或者

char t[32];
sprintf_s(t, "%05d", 1);

将输出00001,因为OP已经想要做

答案 4 :(得分:1)

在C ++ 20中,您可以执行以下操作:

std::cout << std::format("{:05}", zipCode);

在此期间,您可以使用the {fmt} librarystd::format是基于。

免责声明:我是{fmt}和C ++ 20 std::format的作者。