【问题标题】:How can I convert a float to string?如何将浮点数转换为字符串?
【发布时间】:2018-02-15 12:29:05
【问题描述】:

如何将浮点值转换为字符串?无论出于何种原因,我能找到的文档和所有在线资源都只与其他方式有关。

let value: f32 = 17.65;
let value_as_str: String = ..... 

【问题讨论】:

  • 我敢打赌这是重复的,但我找不到类似的问题。
  • 旁白:在 C 语言中,使用sprintf(buf, sizeof buf, "%.*e", FLT_DECIMAL_DIG - 1, some_float);float 打印到一个足够多但数字不多的字符串。可能会为您提供一些想法。
  • 我实际上不知道 C 的 FLT_DECIMAL,所以谢谢你。 C++ 使用 std::to_string 更好;我在 rust 中寻找类似的东西。
  • 请注意,std::to_string 使用固定(非指数符号),倾向于将较小的 float 转换为“0.000000”和带有过多数字的非常大的值。我想知道.to_string() 是否也这样做?
  • 我在答案中添加了有关如何使用小数点后固定位数以及如何使用指数符号进行格式化的示例。

标签: rust


【解决方案1】:

有时,答案很简单:to_string()

let pi = 3.1415926;
let s = pi.to_string();  // : String

背景

“创建某事物的可读字符串表示”的基础在fmt module。这个模块中最重要的特征可能是DisplayDisplay 是对可以格式化为面向用户的字符串的类型的抽象(几乎正是您想要的)。通常Display trait 被println!() 和朋友使用。因此,您已经可以使用 format!() 宏将浮点数转换为字符串:

let s = format!("{}", pi);

但还有别的东西:ToString trait。这个 trait 讨论了可以转换为 String 的类型。现在,有一个神奇的实现:

impl<T> ToString for T 
    where T: Display + ?Sized

这意味着:每个实现Display 的类型也会自动实现ToString!所以不用写format!("{}", your_value),你可以写your_value.to_string()

虽然这些通配符实现非常有用且用途广泛,但它们有一个缺点:查找方法要困难得多。正如您所指出的,the documentation of f32 根本没有提到to_string()。这不是很好,但这是一个已知问题。我们正在努力改善这种情况!

高级格式化

to_string() 方法使用默认格式选项,因此它等效于format!("{}", my_value)。但有时,您想调整如何将值转换为字符串。为此,您必须使用format!()fmt 格式说明符的全部功能。您可以在module documentation 中阅读有关这些内容的信息。一个例子:

let s = format!("{:.2}", pi);

这将产生一个恰好小数点后两位数 ("3.14") 的字符串。

如果您想使用科学记数法将浮点数转换为字符串,您可以使用与LowerExp(或@987654328)对应的{:e}(或{:E})格式说明符@) 特质。

let s = format!("{:e}", pi * 1_000_000.0);

这将导致"3.1415926e6"

【讨论】:

  • 谢谢,我会尽快接受您的答复。为什么这不在f32 的文档中? doc.rust-lang.org/std/primitive.f32.html
  • @PhilippLudwig 我添加了一堆解释。我希望这可以澄清事情:)
  • 这确实澄清了情况。非常感谢您的努力!
  • 有时,答案很简单。好吧,但是例如的输出(1e-300).to_string() 非常出乎意料,并且与字符串化浮点数在许多其他语言中的工作方式不同。获取人类友好的字符串实际上是does not seem to be straighforward
猜你喜欢
  • 2011-11-25
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
相关资源
最近更新 更多