24

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

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

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

这引起了几个问题,因为基本上其他所有内容都使用点来分隔十进制数字。

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

4

3 回答 3

25

有几个局部变量可以控制 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。它们都被格式化为<language>_<nation>.UTF-8. 该UTF-8部分是可选的。

为了切换到“北美”浮动分离样式,只需设置LC_NUMERIC其美国值:

$ export LC_NUMERIC="en_US.UTF-8"

简单地将变量设置LC_NUMERIC为常规变量是行不通的。您需要使用导出命令。

~/.bashrc您可以将其放在脚本的标题中,也可以通过将其添加到您或您的~/.bash_profile文件中来使其永久化。

希望这有帮助!

于 2012-10-11T17:53:54.980 回答
11

如果您不想弄乱系统配置,您可以尊重您的语言环境,但请确保您的脚本使用点作为小数:

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

$ LANG=C printf "%f" 3.5
3.500000
于 2016-01-12T11:22:18.173 回答
3

采用:

$ 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
于 2020-06-24T09:55:01.563 回答