C++ printf 函数中的参数化前导零

4
我的问题很简单。我想使用printf打印指定数量的前导零整数。但是,前导零的数量是在运行时决定的,而不是预先知道的。我该怎么做?
如果我知道字符数(比如说5个),那么可以这样做:
printf("%05d", number);

但我不知道它是否会是5。

5个回答

10

您可以使用*来传递宽度:

printf("%0*d", 5, number);

除了你的例子中传递的是宽度而不是精度。精度必须以 '.' 开头,例如 printf("%.*d", 5, number) - James Kanze
@JamesKanze 好的,我已经修复了那个错误。 - Rafał Rawicki

5
您可以使用以下方法来完成此操作。
cout << setw(width_) << setfill('0') << integerVariable_;

其中width_是在运行时确定的。


谢谢,那个方法可以用,但在我的情况下我需要使用printf。无论如何还是谢谢! - Chicoscience

2
这里的标准解决方案是在C语言的printf系列中使用printf("%.*d", precision, number);precision格式化字段指定要显示的最小数字位数,预设值为1。这与宽度无关,因此可以编写以下内容:
printf("%6.3d", 12);    // outputs "   012"
printf("%6.0d",  0);    // outputs "      ", without any 0

对于宽度或精度(或两者),您可以指定'*',这将导致printf从参数中获取值(传递一个int):

printf("%6.*d", 3, 12); // outputs "   012"
printf("%*.3d", 6, 12); // outputs "   012"
printf("%*.*d", 6, 3, 12);  // outputs "   012"

很遗憾,在ostream中没有相应的功能:在输出整数时,精度会被忽略。(这可能是因为精度没有类型相关的默认值。默认值是6,适用于所有尊重它的类型。)


2
我相信在大多数平台上,可以使用星号来实现这一点。
int width = whatever();
printf("%0*d", width, number );

2
这是C标准(适用于printf系列)。遗憾的是,在iostream中不支持它——精度字段在整数输出中被忽略。 - James Kanze
@Ivan K Rafal已经提供了相同的答案,请不要重复回答,而是使用评论进行微小的更改。 - amod
@amod0017:为什么?正如您所看到的,作者仍然没有更新它,并且硬编码了一个值!我更喜欢当前形式的答案,因为它真正地进行了参数化。 - László Papp
@Ipapp 我认为他本可以建议进行编辑,而不是仅仅聪明地复制粘贴。 - amod

-1

使用C++中提供的操纵符setw和setfill。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接