【问题标题】:Constant number of characters in floating point number in bashbash中浮点数中的常量字符数
【发布时间】:2012-06-28 08:11:17
【问题描述】:

我需要用 bash 对数字进行一些“漂亮”的格式化。我有一串科学格式的逗号分隔浮点数(即 3.14159 或 1.0601e-12),我需要创建一个逗号分隔的列表,其中所有数字都有尽可能多的字符。填充时使用空格还是零并不是很重要(即“3.14”和“3.140000”都有效)。我尝试将 printf 与“%.12f”一起使用,但这当然行不通。我没有想法(除了在角色层面上工作,但这似乎过于复杂)

非常感谢您的帮助。

【问题讨论】:

  • “当然行不通”是什么意思?
  • 因为 printf "%.12f" 在点之后打印 12 个字符,这意味着它例如将数字 12e-24 变为 0...我需要能够设置有效数字而不是小数位。
  • 您不能在同一个 printf 语句中同时使用字段宽度和精度修饰符——至少在我的系统上不行。如果两者都需要,则需要编写代码。
  • @CodeGnome:你不能在你的系统上做printf '%30.16f' 1.0601e-12
  • @DennisWilliamson 试试printf "%'30.24f\n" 3.140000 3000 1.0601e-12 3000000000。这可能是可能的,但选项的组合并不总是符合您的预期 - 请注意第 4 行的宽度。

标签: bash


【解决方案1】:

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

printf "%'24f\n" 3.140000 3000

【讨论】:

  • 谢谢,这几乎解决了它,必须按照 Hai Vu 的建议使用 %e 而不是 %f。这解决了它printf "%'12e" 3.140000
【解决方案2】:

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

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

【讨论】:

  • 谢谢您,只需在您的解决方案中添加一个 ' 即可解决我的问题!
【解决方案3】:

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

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

虽然我希望看到更优雅的方式。

【讨论】:

  • 废话我误读了这个问题 - 零或空格填充没有重要。呸,呸。
猜你喜欢
  • 2011-09-27
  • 2019-04-07
  • 2022-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多