我想将浮点数打印为表格,如下所示。
(红宝石)
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)
我应该如何格式化?
正如 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_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));
}
}
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)
归档时间: |
|
查看次数: |
2198 次 |
最近记录: |