bash中浮点数的常量字符数

时间:2012-06-27 21:09:19

标签: bash

我需要用bash做一些“漂亮”的数字格式。我有一串逗号分隔的浮点数,科学格式(即3.14159或1.0601e-12),我需要创建一个逗号分隔列表,其中所有数字都有多个字符。空格或零是否用于填充(即'3.14'和'3.140000'都起作用)并不是很重要。我尝试使用带有“%。12f”的printf,但这当然不起作用。我没有想法(除了在角色级别上工作,但这看起来过于复杂)

我真的很感激帮助。

3 个答案:

答案 0 :(得分:2)

如果您只想在输出中指定恒定数量的字符,则可以使用 field-width 修饰符。例如,要确保每个字段只有24个字符:

printf "%'24f\n" 3.140000 3000

答案 1 :(得分:1)

对于浮点数,使用%f,对于科学记数法,请使用%e:

$ printf "%12.2f\n" 359.197
      359.20
$ printf "%12.2e\n" 359.197
    3.59e+02

答案 2 :(得分:0)

左边的零填充比动态小数精度更容易。这是一个裂缝,不确定它是否符合您的要求。

IFS=, read -ra a <<<'1.234567e+3,5432.623,54326e+4,12.26546e+3,1000000000000,2.3641867e+4'

for idx in "${!a[@]}"; do
    printf -v "b[${b:=0}>b&&(b=$b),idx+1]" '%f%n' "${a[idx]}" b
done

for idx in "${!a[@]}"; do
    printf -v 'a[idx]' '%#.*f' $((b - ${#b[idx+1]})) "${b[idx+1]}"
done

# IFS=, declare -a 'b=("${a[*]}")'
# echo "$b"
printf '%s\n' "${a[@]}"

给出了

1234.567000000
5432.623000000
543260000.0000
12265.46000000
1000000000000.
23641.86700000

虽然我很想看到更优雅的方式。