string - 如何在 Rust 中获得 float 的紧凑但无损的字符串表示?

标签 string rust

作为 How can I convert a float to string? 的变体,我正在寻找一种简单的方法来获取既简洁又无损的 float 的字符串表示形式。例如:

let a = 1.0;
let b = 1.1234567890123456789012345678901e50;
let c = 1.1234567890123456789012345678901e-50;
for x in &[a, b, c] {
    println!("{}", x);
    println!("{:?}", x);
    println!("{}", x.to_string());
    println!("{}", f64::to_string(&x));
    println!("{:e}", x);
}

这会产生:

1
1.0
1
1
1e0
112345678901234570000000000000000000000000000000000
112345678901234570000000000000000000000000000000000.0
112345678901234570000000000000000000000000000000000
112345678901234570000000000000000000000000000000000
1.1234567890123457e50
0.000000000000000000000000000000000000000000000000011234567890123456
0.000000000000000000000000000000000000000000000000011234567890123456
0.000000000000000000000000000000000000000000000000011234567890123456
0.000000000000000000000000000000000000000000000000011234567890123456
1.1234567890123456e-50

换句话说:

  • {}{:?}x.to_string()f64::to_string(&x) 都产生许多前导/尾随零。
  • {:e} 有助于打印 bc,但它对所有数字强制使用指数表示法,这会导致不寻常的表示像 1e0

有没有办法生成一个无损的字符串,并且只在适当的时候自动使用指数表示法?

这样的转换可以扩展到所有数字类型吗?


明确目标。我基本上想要字符串化 float 在其他编程语言中的工作方式相同,这些编程语言巧妙地从定点符号变为指数符号以产生精确的、人类可读的表示。例如在 JVM 上:

scala> (1.1234567890123456789012345678901e50).toString()
res1: String = 1.1234567890123457E50

scala> (1.0).toString()
res2: String = 1.0

scala> (1.1234567890123456789012345678901e-50).toString()
res3: String = 1.1234567890123456E-50

最佳答案

这里的要求有点模糊。您可能想尝试 ryu crate 看看它是否符合您的需求:

use ryu;  // ryu = "1.0"

fn main() {
    let mut buffer = ryu::Buffer::new();
    let a = 1.0;
    let b = 1.1234567890123456789012345678901e50;
    let c = 1.1234567890123456789012345678901e-50;
    for &x in [a, b, c].iter() {
        println!("{}", buffer.format(x));
    }
}

它产生输出:

1.0
1.1234567890123457e50
1.1234567890123456e-50

关于string - 如何在 Rust 中获得 float 的紧凑但无损的字符串表示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59794031/

相关文章:

java - 如何在 Java 中比较字符串?

python - 如何将变量的值放入字符串中(将其插入字符串中)?

csv - 如何在不复制的情况下在 Rust 中迭代 Vec 时分配切片?

data-structures - 如何锁定 Rust 数据结构的内部结构?

rust - 库箱中多个可执行文件的文件布局

string - Prolog:检查字符串的第一个和最后一个字符是否是左右花括号 ('{' & '}' )

python - 将字符串列表 [ '3' , '1' , '2' ] 转换为排序整数列表 [1, 2, 3]

C++ 字符串输入作为 if/else 语句条件

rust - 如何将字符串传递给接受 Into<&str> 的方法?

generics - 为什么我需要为不是结构成员的结构的通用参数提供生命周期?