在 Rust 中,实现 `Display` 特性时,如何获取调用者指定的格式?

问题描述 投票:0回答:2

给出这个 Rust 程序,它打印

1.23456
:

use std::fmt;
struct Foo(f64);
impl fmt::Display for Foo {
    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(formatter, "{}", self.0)
    }
}
fn main() {
    println!("{:.2}", Foo(1.23456));
}

对函数体

fmt
进行最简单的更改以打印
1.23
? 一般来说,是否有一种简单的方法可以在函数内部使用打印对象的代码设置的相同格式选项?我知道格式化程序对象有几种访问格式化选项的方法,但是有没有一种简单的方法可以始终获得通过调用
fmt
获得的相同结果?
    

rust display formatter fmt
2个回答
1
投票
所有

格式选项传递给println!("{:.2}", Foo(1.23456).0);,您只需调用

.0
即可:
.fmt

(参见
游乐场


0
投票
use std::fmt; struct Foo(f64); impl fmt::Display for Foo { fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { self.0.fmt(formatter) } } fn main() { println!("{:.2}", Foo(1.23456)); }

文档中,
Formatter后面的数字称为精度,您可以像这样传递它:

.
当然,您可能希望默认为不同的精度,或者不在 
impl fmt::Display for Foo { fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { if let Some(precision) = formatter.precision() { // If we received a precision, we use it. write!(formatter, "Foo({1:.*})", precision, self.0) } else { // Otherwise we default to 2. write!(formatter, "Foo({:.2})", self.0) } } }

分支中指定精度。

    

© www.soinside.com 2019 - 2024. All rights reserved.