使用 std::fmt 格式化时,如何按可变数量填充数字?

Posted

技术标签:

【中文标题】使用 std::fmt 格式化时,如何按可变数量填充数字?【英文标题】:How can I 0-pad a number by a variable amount when formatting with std::fmt? 【发布时间】:2017-01-24 05:44:30 【问题描述】:

我希望在将字符串显示给用户之前对其进行 0 填充,例如

let x = 1234;
println!(":06", x); // "001234"

但是,我希望输出字符串的长度是可变的,例如它可以由用户的命令行参数设置:

let x = 1234;
let width = 6;
println!(":0*", width, x); //fails to compile
// error: invalid format string: expected `''`, found `'*'`

与精度不同,0-padding 似乎不支持 * 指定宽度。

我不是在寻找涉及手动填充的解决方案,因为重新实现 std::fmt 的一部分似乎很尴尬。

【问题讨论】:

【参考方案1】:

您可以将:0_ 格式说明符与变量一起使用:

println!(":0width$", x, width = width); // prints 001234

Here it is running in the playground

同样,如果width <= 4,它只会打印1234。如果width = 60,则打印:

000000000000000000000000000000000000000000000000000000001234

格式参数也支持序数,因此这也有效:

println!(":01$", x, width);

documentation for std::fmt 列出了print_! 宏支持的各种参数和修饰符。

【讨论】:

请注意:这也是带有序数的单词:println!(":01$", x, width)。此外,可能值得链接到说明所有这些的std::fmt docs。 谢谢@DK。我已经添加了您提出的改进建议。 有用的例子可以在这里找到:doc.rust-lang.org/std/fmt/index.html#fillalignment

以上是关于使用 std::fmt 格式化时,如何按可变数量填充数字?的主要内容,如果未能解决你的问题,请参考以下文章

python07_函数

python 函数参数

如何检查NSString格式是否包含与可变参数相同数量的说明符?

如何在r中打印可变数量的参数?

当输入的数量可变时,如何使用神经网络?

Ngrx 状态可变性