我需要用 bash 对数字进行一些“漂亮”的格式化。我有一串科学格式的逗号分隔浮点数(即 3.14159 或 1.0601e-12),我需要创建一个逗号分隔的列表,其中所有数字都有尽可能多的字符。填充时使用空格还是零并不是很重要(即“3.14”和“3.140000”都有效)。我尝试将 printf 与“%.12f”一起使用,但这当然行不通。我没有想法(除了在角色级别上工作,但这似乎过于复杂)
我真的很感激帮助。
我需要用 bash 对数字进行一些“漂亮”的格式化。我有一串科学格式的逗号分隔浮点数(即 3.14159 或 1.0601e-12),我需要创建一个逗号分隔的列表,其中所有数字都有尽可能多的字符。填充时使用空格还是零并不是很重要(即“3.14”和“3.140000”都有效)。我尝试将 printf 与“%.12f”一起使用,但这当然行不通。我没有想法(除了在角色级别上工作,但这似乎过于复杂)
我真的很感激帮助。
如果您只想在输出中指定恒定数量的字符,则可以使用field-width修饰符。例如,要确保每个字段正好有 24 个字符:
printf "%'24f\n" 3.140000 3000
对于浮点数,使用 %f,对于科学计数法,使用 %e:
$ printf "%12.2f\n" 359.197
359.20
$ printf "%12.2e\n" 359.197
3.59e+02
左边的零填充比动态小数精度更容易。这是一个裂缝,不确定它是否符合您的要求。
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
虽然我很想看到一种更优雅的方式。