我希望在向用户显示字符串之前先对其进行0-pad,例如.

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填充似乎不支持*来指定宽度.

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

推荐答案

可以将: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_!宏支持的各种参数和修改器的详细说明.

Rust相关问答推荐

给定使用newype习语定义的类型上的铁 rust Vec,有没有方法获得底层原始类型的一部分?

收集RangeInclusive T到Vec T<><>

什么是Rust惯用的方式来使特征向量具有单个向量项的别名?

Arrow RecordBatch as Polars DataFrame

为什么实例方法可以像Rust中的静态方法一样被调用?

通过不同的字段进行散列和排序的 struct (需要不同的EQ实现)

这是不是在不造成嵌套的情况下从枚举中取出想要的变体的惯用方法?

重写Rust中的方法以使用`&;mut self`而不是`mut self`

在rust sqlx中使用ilike和push bind

如何在不调用Collect()的情况下为新型vec实现IntoIterator?

为什么不';t(&;mut-iter).take(n)取得iter的所有权?

在 Rust 中,在需要引用 self 的 struct 体方法中使用闭包作为 while 循环条件

面临意外的未对齐指针取消引用:地址必须是 0x8 的倍数,但为 0x__错误

Sized问题的动态调度迭代器Rust

枚举的利基优化如何在 Rust 中工作?

我可以在 Rust 中 serde struct camel_case 和 deserde PascalCase

Rust 中的 Option as_ref 和 as_deref 有什么不同

Rust Serde 为 Option:: 创建反序列化器

为什么在 rust 中删除 vec 之前应该删除元素

TinyVec 如何与 Vec 大小相同?