如何在bash中更改printf命令中的小数点分隔符?

时间:2012-10-11 17:53:55

标签: bash printf

我使用Cygwin的意大利语本地化,因此我的printf命令使用逗号分隔浮点数,并且不理解以点分隔的浮点数

$ printf "%f" 3.1415
-bash: printf: 3.1415: invalid number
0,000000

$ printf "%f" 3,1415
3,141500

这会产生一些问题,因为基本上所有其他东西都使用点来分隔十进制数字。

如何将小数点分隔符从逗号更改为点?

3 个答案:

答案 0 :(得分:15)

有几个局部变量可以控制cygwin(或任何bash shell)的本地化。您可以使用locale命令查看它们及其值。你应该看到这样的东西:

$ locale
LANG=it_IT.UTF-8
LC_CTYPE="it_IT.UTF-8"
LC_NUMERIC="it_IT.UTF-8"
LC_TIME="it_IT.UTF-8"
LC_COLLATE="it_IT.UTF-8"
LC_MONETARY="it_IT.UTF-8"
LC_MESSAGES="it_IT.UTF-8"
LC_ALL=

您可以使用locale -va查看变量的可能值。它们的格式都是_.UTF-8。 UTF-8是可选的。 为了切换到北美浮动分离样式,只需将LC_NUMERIC设置为其美国值。

$ export LC_NUMERIC="en_US.UTF-8"

只需将变量LC_NUMERIC设置为常规变量就不起作用,您需要使用export命令。

您可以将其添加到脚本的标题中,也可以将其添加到~/.bashrc~/.bash_profile

中。

希望这有用!

答案 1 :(得分:7)

If you don't want to mess with system configuration, you can respect your locale but make sure your script uses dots for decimals with:

$ printf "%f" 3.5
-bash: printf: 3,5: invalid number
0.000000

$ LANG=C printf "%f" 3.5
3.500000

答案 2 :(得分:1)

使用:

$ VAR=3,1415
$ echo ${VAR/,/.}

3.1415

$ VAR=${VAR/,/.}
$ echo $VAR

3.1415

另一个例子:

VAR=$(echo "scale=1; $NUMBER/60" | bc)
VAR=${VAR/./,}

$ VAR=$(echo "scale=1; 150/60" | bc);echo $VAR

2.5

$ VAR=$(echo "scale=1; 150/60" | bc); VAR=${VAR/./,};echo $VAR

2,5