使用 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 格式化时,如何按可变数量填充数字?的主要内容,如果未能解决你的问题,请参考以下文章