如何获得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)与前导零。 这些示例使用bc
, AWK
和Python 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”
说明:
-
对于所有只以
-.
开头的东西-.
,取代-.
与-0.
-
对于所有只有开始
.
,更换.
与0.