什么是将值格式化为多种字符串的惯用Rust方式?

use*_*932 4 rust

我有a的形式的纬度,f64我需要将它转换成一个String.起初我想过实现Display,像这样:

struct Latitude(f64);

impl fmt::Display for Latitude {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "{} {}", if self.0 > 0. { "N" } else { "S" }, self.0)
    }
}

fn main() {
    let lat: f64 = 45.;
    println!("{}", Latitude(lat));
}
Run Code Online (Sandbox Code Playgroud)

在那之后,我有额外的要求.我需要转换为两种表示形式之一:

  1. N 70.152351
  2. N 70° 09' 08"

还有一个额外的旗帜; 什么时候false,我需要这样的东西:

  1. - --.------
  2. - --° -' -"

实现这一目标的最简单方法是:

fn format_lat(degree: f64, use_min_sec_variant: bool, is_valid: bool) -> String;
Run Code Online (Sandbox Code Playgroud)

但是,我在Rust标准库中看不到任何自由函数.

也许我应该使用struct Latitude(f64)并实现一个to_string方法?或许我应该实施其他一些特质?

She*_*ter 5

您可以使用不同类型的格式创建包装类型,并将它们作为方法返回:

struct Latitude(f64);
struct MinutesSeconds(f64);

impl Latitude {
    fn minutes_seconds(&self) -> MinutesSeconds {
        MinutesSeconds(self.0)
    }
}

impl fmt::Display for MinutesSeconds {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "latitude in a different format")
    }
}
Run Code Online (Sandbox Code Playgroud)

这是同样的想法Path::display.

至于有效/无效的概念,听起来你真的想要一个struct Latitude(Option<f64>),然后None在它无效时提供.