0

我的 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 个零与点分开。

我的问题:如果我输入 0.1 innum1和 0.1 in num2,为什么结果看起来像这样?

printf : 0.2: invalid number
result : 0

我希望我的 bash 脚本打印result: 0.2而不是invalid number

4

4 回答 4

4

%d用于整数。试试%f吧。

于 2013-05-29T16:24:20.800 回答
1

这样怎么样?

echo "num 1 :"
read num1
echo "num 2 :"
read num2
awk -v a="$num1" -v b="$num2" 'BEGIN{print "result:" a+b}';

如果您需要某种格式的输出,您可以printf在 awk 中使用

于 2013-05-29T16:23:58.143 回答
0

你的要求有点奇怪“带分隔点的整数(1.000.000)”,你一直在做什么?

此外,我会在 ..... echo "scale=4; $num1 + $num2" | 公元前

对于“无效数字输出” :: bash 的 printf 使用与 C 的 printf() 函数中可用的相同格式,作为 libc 库的一部分....因此

%d , %i : stands for integers 
%g , %f : stands for floating point ... likewise ,

这使用了 printf() 将在 ac-program 中使用的相同验证,因此将注释“无效数字”放在需要整数的地方遇到浮点数,如下所示:

 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
于 2013-06-03T03:29:54.327 回答
0

所以你想看到'。作为千位分隔符还作为小数点?坏主意,因为那样你就无法确定 1.234 是浮点数还是整数。

语言环境用于处理此类事情(需要安装这些语言环境):

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

如您所见,这些语言环境都没有使用相同的字符作为千位分隔符和小数点,这很好。

一旦你选择了合适的语言环境,你只能同意肯特。如果你不喜欢 bc 的格式,awk 比 bc 好。

于 2013-06-02T21:49:42.893 回答