我的bash脚本是
read -p "num 1: " num1
read -p "num 2: " num2
tmbk=$(echo $num1 + $num2 | bc | sed '
s/^\./0./ # .2 -> 0.2
s/^-\./-0./ # -.2 -> -0.2
s/\.0*$// # 2.000 -> 2
');
printf "result : %'d\n" $tmbk
我使用printf "%'d\n"
将3与零分开。如果我使用printf "%s\n"
字符串,则此命令不会将3与零分开。
我的问题:
如果我在num1
输入0.1,在num2
输入0.1,为什么结果看起来像这样?
printf : 0.2: invalid number
result : 0
我希望我的bash脚本能够打印result: 0.2
而不是invalid number
答案 0 :(得分:4)
%d
用于整数。请改为%f
。
答案 1 :(得分:1)
以这种方式怎么样?
echo "num 1 :"
read num1
echo "num 2 :"
read num2
awk -v a="$num1" -v b="$num2" 'BEGIN{print "result:" a+b}';
如果您需要某种输出格式,可以在awk中使用printf
答案 2 :(得分:0)
所以你想看''。作为千分隔符还要作为小数点? 不好主意因为那时你无法确定1.234是浮点数还是整数。
locales用于处理此类事物(需要安装这些语言环境):
for loc in C en_US de_DE de_CH; do
LC_NUMERIC=$loc
printf "%'d\t%'f\t%s\n" 1234 1234 $loc
done
结果:
1234 1234.000000 C
1,234 1,234.000000 en_US
1.234 1.234,000000 de_DE
1'234 1'234.000000 de_CH
如您所见,这些语言环境中没有一个使用相同的字符表示千位分隔符和小数点,这很好。
一旦你选择了合适的语言环境,你就只能同意Kent的观点。如果你不喜欢bc的格式化,awk比bc更好。
答案 3 :(得分:0)
你的要求有点奇怪“有分离点的整数(1.000.000)”,你一直在做什么?
另外我会在行中做一个小的补充..... echo“scale = 4; $ num1 + $ num2”| bc
表示“无效数字输出”:: bash的printf使用与C的printf()函数中相同的格式,作为libc库的一部分....因此
%d , %i : stands for integers
%g , %f : stands for floating point ... likewise ,
这使用了printf()在c程序中使用的相同验证,因此将注释“invalid number”置于遇到一个期望整数的float上,如下所示:
Kaizen ~
$ printf "result : %'d\n" 2.3
-bash: printf: 2.3: invalid number
result : 2
Kaizen ~
$ printf "result : %'li\n" 2.3
-bash: printf: 2.3: invalid number
result : 2
我同意@ignacio建议的内容,因此如果您要使用浮点值进行打印,那么您应该在代码中添加%g或更高的%f。以下内容适用于您的代码中的所有方案:
Kaizen ~
$ printf "result : %'f\n" 2.3
result : 2.300000
Kaizen ~
$ printf "result : %'g\n" 2.3
result : 2.3