有几条评论提到std::setfill('0')
and std::setw
。虽然这些are必要的,但它们不足以完成任务。例如,这段代码:
std::cout << std::setfill('0') << std::setw(7) << std::showpos << 0.012;
将产生:0+0.012
作为其输出。这显然不完全是我们想要的。
我们需要添加std::internal
标志告诉流插入“内部填充”——即填充应该插入在符号和数字的其余部分之间,所以代码如下:
std::cout << std::setfill('0') << std::setw(7) << std::internal << std::showpos << 0.012;
...产生我们想要的输出:+00.012
.
另请注意,填充字符是“粘性”的,因此如果您交替使用std::setw
对于数字和非数字类型,您可能每次都需要/想要更改它。否则,类似的事情std::cout << setw(12) << name;
将产生如下结果:0000000Jerry
,这也是很少需要的。
为了确保小数点后的位数始终相同,我们还需要设置std::fixed
标志,并指定位数std::setprecision
, 例如:
#include <iostream>
#include <iomanip>
#include <vector>
int main() {
std::vector<double> values { 0.1234, 1.234, 1.5555 };
for (auto d : values)
std::cout << std::internal << std::showpos << std::setw(9)
<< std::setprecision(3) << std::setfill('0') << d << "\n";
}
这会产生我认为需要的输出:
+0000.123
+0001.234
+0001.556
但在一种情况下,您将无法通过这种方式获得对齐的结果:如果您的数字太大而无法放入所提供的字段中,则仍将打印小数点之前的所有位。例如,如果我们添加1e10
对于前面的代码要打印的数字列表,它将打印为:+10000000000.000
,这显然与其他部分不一致。
处理这个问题的明显方法就是忍受它,如果它经常出现而需要关心,则增加字段大小以容纳更大的数字。
另一种可能性是仅在数字低于特定阈值时使用固定记数法,并针对较大的数字切换到(例如)科学记数法。
至少根据我的经验,这样的代码往往主要用于财务数据,在这种情况下,后一种选择通常是不可接受的。