gpt4 book ai didi

rust - 以科学记数法打印的 float 的对齐

转载 作者:行者123 更新时间:2023-12-03 11:30:34 27 4
gpt4 key购买 nike

我想将浮点数打印为表格,如下所示。
( ruby )

irb(main):001:0> printf("%10.3e  %10.3e\n%10.3e  %10.3e", 0.1111, 0.02222, 3333, -44444)
1.111e-01 2.222e-02
3.333e+03 -4.444e+04
然而,在 Rust 中, {:10.3e}格式不对齐 e.
fn main() {
println!("{:10.3e} {:10.3e}\n{:10.3e} {:10.3e}", 0.1111, 0.02222, 3333, -44444);
}
  1.111e-1    2.222e-2
3.333e3 -4.444e4
我应该如何格式化?

最佳答案

正如 Thomas 在评论中提到的,目前仅使用 Rust 的 formatting parameters 是不可能的。因此,您必须实现自己的实用程序格式化功能(或找到提供它的 crate )。
这是我拼凑的快速解决方案:

fn fmt_f64(num: f64, width: usize, precision: usize, exp_pad: usize) -> String {
let mut num = format!("{:.precision$e}", num, precision = precision);
// Safe to `unwrap` as `num` is guaranteed to contain `'e'`
let exp = num.split_off(num.find('e').unwrap());

let (sign, exp) = if exp.starts_with("e-") {
('-', &exp[2..])
} else {
('+', &exp[1..])
};
num.push_str(&format!("e{}{:0>pad$}", sign, exp, pad = exp_pad));

format!("{:>width$}", num, width = width)
}
  • width 控制左填充空格的数量
  • precision 是小数位数
  • exp_pad 控制左填充的量 0 s

  • 示例:
    fn main() {
    let nums = [
    0.1111,
    0.02222,
    3333.0,
    -44444.0,
    0.0,
    1.0,
    42.0,
    9999999999.00,
    999999999999.00,
    123456789.1011,
    ];

    for &num in &nums {
    println!("{}", fmt_f64(num, 10, 3, 2));
    }
    }
    输出:
     1.111e-01
    2.222e-02
    3.333e+03
    -4.444e+04
    0.000e+00
    1.000e+00
    4.200e+01
    1.000e+10
    1.000e+12
    1.235e+08

    关于rust - 以科学记数法打印的 float 的对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65264069/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com