如何获得bc(1)打印前导零?

我在Makefile中做了如下的事情:

echo "0.1 + 0.1" | bc 

(当然,在真实文件中,数字是dynamic的)

它打印.2但我想打印0.2

我想这样做,而不诉诸于sed但我似乎无法find如何让bc打印零。 或者是bc只是无法做到这一点?

您也可以使用awk来格式化:

  echo "0.1 + 0.1" | bc | awk '{printf "%f", $0}' 

或者用awk自己做math:

  echo "0.1 0.1" | awk '{printf "%f", $1 + $2}' 

这可能适合你:

 echo "x=0.1 + 0.1; if(x<1) print 0; x" | bc 

在快速查看源代码 (请参阅bc_out_num() ,第1461行)后,如果整数部分为0 ,则看不到显示前导0的明显方法。 除非我遗漏了一些东西,否则这种行为不依赖于可以使用命令行标志来改变的参数。

简短的回答:不,我不认为有一种方法可以用你想要的方式来打印数字。

如果你仍然想使用bc我没有发现使用sed有什么问题。 以下看起来不可怕,恕我直言:

 [me@home]$ echo "0.1 + 0.1" | bc | sed 's/^\./0./' 0.2 

如果你真的想避免sed , eljunior和choroba的build议是相当整洁,但他们需要价值依赖调整,以避免尾随零。 这对你来说可能也可能不是问题。

在文档中找不到输出格式。 而不是sed,你也可以达到printf:

 printf '%3.1f\n' $(bc<<<0.1+0.1) 
 $ bc -l <<< 'x=-1/2; if (length (x) == scale (x) && x != 0) { if (x < 0) print "-",0,-x else print 0,x } else print x' 

这个是纯粹的bc 。 它通过比较length结果和expression式的scale来检测前导零。 它在正数和负数都有效。

这个也会处理负数:

 echo "0.1 - 0.3" | bc | sed -r 's/^(-?)\./\10./' 

这只使用BC,并使用负数:

 bc <<< "x=-.1; if(x==0) print \"0.0\" else if(x>0 && x<1) print 0,x else if(x>-1 && x<0) print \"-0\",-x else print x"; 

尝试一下:

 for y in "0" "0.1" "-0.1" "1.1" "-1.1"; do bc <<< "x=$y; if(x==0) print \"0.0\" else if(x>0 && x<1) print 0,x else if(x>-1 && x<0) print \"-0\",-x else print x"; echo; done 

bc可能并不是现代最好的“台式计算器”。 其他语言会给你更多的控制权。 这里是工作的例子,打印值范围(-1.0 .. + 1.0)与前导零。 这些示例使用bcAWKPython 3

 #!/bin/bash echo "using bc" time for (( i=-2; i<=+2; i++ )) { echo $(bc<<<"scale=1; x=$i/2; if (x==0||x<=-1||x>=1) { print x } else { if (x<0) { print \"-0\";-x } else { print \"0\";x } } ") } echo echo "using awk" time for (( i=-2; i<=+2; i++ )) { echo $(echo|awk "{printf \"%.1f\",$i/2}") } echo echo "using Python" time for (( i=-2; i<=+2; i++ )) { echo $(python3<<<"print($i/2)") } 

请注意,Python版本的速度要慢10倍左右。

build立在答复的答案 ,

对于部分结果:

 echo "x=0.1 + 0.1; if(x<1 && x > 0) print 0; x" | bc -l 

请注意,否定结果将无法正确显示。 水瓶座力量有一个解决scheme 。

echo "$a / $b" | bc -l | sed -e 's/^-\./-0./' -e 's/^\./0./'

这应该适用于所有结果如下的情况:

  • “-.123”
  • ” 0.123"
  • “-1.23”
  • “1.23”

说明:

  1. 对于所有只以-.开头的东西-. ,取代-.-0.

  2. 对于所有只有开始. ,更换.0.