假设我有一个 POSIX shell 脚本
- 需要在我无法控制的不同系统/环境上运行,并且
- 需要从尊重区域设置的程序发出的字符串中删除小数分隔符。
如何以最通用的方式检测小数点分隔符?
答案1
问locale
:
locale decimal_point
这将使用当前区域设置输出小数点。
如果您需要千位分隔符:
locale thousands_sep
您可以通过请求查看所有数字关键字类别LC_NUMERIC
:
locale -k LC_NUMERIC
答案2
如果这是一个zsh
shell 脚本,您可以在模块$langinfo
中使用特殊的关联数组zsh/langinfo
:
zmodload zsh/langinfo
radix=$langinfo[RADIXCHAR]
(映射到标准nl_langinfo(RADIXCHAR)
,请参阅man nl_langinfo
您的系统以了解详细信息;$langinfo[THOUSEP]
对于千位分隔符)。
在bash
脚本中(也可以在zsh
)中,您应该能够获得它,而无需使用printf
内置命令分叉单独的进程:
printf -v radix %.1f 1 && radix=${radix:1:1}
要使用 ksh93 shell 将数字从用户区域设置格式转换为 C 区域设置格式,您可以这样做:
$ locale title
German locale for Germany
$ x=1.123.456,78 ksh -c 'typeset -F x="$x"; LC_ALL=C; printf "%.23g\n" "$x"'
1123456.78