以科学记数法打印的浮点数对齐

kkk*_*kkk 5 rust

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

(红宝石)

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
Run Code Online (Sandbox Code Playgroud)

然而,在 Rust 中,{:10.3e}格式不对齐e并且.

fn main() {
  println!("{:10.3e}  {:10.3e}\n{:10.3e}  {:10.3e}", 0.1111, 0.02222, 3333, -44444);
}
Run Code Online (Sandbox Code Playgroud)
  1.111e-1    2.222e-2
   3.333e3    -4.444e4
Run Code Online (Sandbox Code Playgroud)

我应该如何格式化?

Val*_*tin 6

正如 Thomas 在评论中提到的,目前仅使用 Rust 的格式化参数是不可能的。因此,您必须实现自己的实用格式化功能(或找到提供它的包)。

这是我整理的一个快速但肮脏的解决方案:

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)
}
Run Code Online (Sandbox Code Playgroud)
  • width控制左侧填充空间的数量
  • precision是小数位数
  • exp_pad0控制左填充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));
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

 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
Run Code Online (Sandbox Code Playgroud)