一对夫妇的意见都提到std::setfill('0')
和std::setw
。虽然这些是必要的,但它们不足以完成任务。例如,此代码:
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
有一个情况下,你不会得到,虽然对齐结果是这样的:如果你有一个数太大,无法在提供的字段,所有之前的地方decim点仍将被打印。例如,如果我们将1e10
添加到前面的代码要打印的数字列表中,则会将其打印为:+10000000000.000
,这显然不会与其他对齐。
处理这个问题的一个显而易见的方法就是忍受它,并且如果它经常出现足以关心的问题,请增大字段大小以容纳更大的数字。
另一种可能性是使用固定的符号,只有数字低于某个阈值,并切换到(例如)科学记数法以获取较大的数字。
至少在我的经验中,这样的代码倾向于主要用于财务数据,在这种情况下后者通常是不可接受的。
请参阅:http://stackoverflow.com/questions/1714515/how-can-i-pad-an-int-with-leading-zeros-when-using-cout-operator – NathanOliver
使用std :: setfill(' 0')和std :: setw() – 911
我不认为'setfilll'将在这种情况下工作。使用'0'作为填充字符,他的第一个结果最终会像'00 + 0.0012'一样,而不是所有数字前面的'+'。 –