用std :: cout正确地用0填充负整数

时间:2013-07-09 08:51:47

标签: c++ iostream cout iomanip

我发现这个问题已经问到了,但每个人给出的答案都是

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

对于正数很好,但是对于-5,它会打印:

000-5

有没有办法让它打印-0005或强制cout始终打印至少5位数(这会导致-00005),就像我们用printf做的那样?

2 个答案:

答案 0 :(得分:17)

std::cout << std::setw(5) << std::setfill('0') << std::internal << -5 << '\n';
//                                                     ^^^^^^^^

输出:

-0005

std::internal

编辑:

对于那些关心此类事物的人,N3337(~c++11),22.4.2.2.2

The location of any padding is determined according to Table 91.
                  Table 91 - Fill padding
State                               Location
adjustfield == ios_base::left       pad after
adjustfield == ios_base::right      pad before
adjustfield == internal and a
sign occurs in the representation   pad after the sign
adjustfield == internal and
representation after stage 1 began
with 0x or 0X                       pad after x or X
otherwise                           pad before

答案 1 :(得分:1)

在 C++20 中,您将能够使用 std::format 来执行此操作:

std::cout << std::format("{:05}\n", -5);  

输出:

-0005

在此期间您可以使用 the {fmt} librarystd::format 是基于。 {fmt} 还提供了 print 函数,使这变得更加简单和高效 (godbolt):

fmt::print("{:05}\n", -5); 

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