当前的小数点分隔符是哪个?

当前的小数点分隔符是哪个?

假设我有一个 POSIX shell 脚本

  1. 需要在我无法控制的不同系统/环境上运行,并且
  2. 需要从尊重区域设置的程序发出的字符串中删除小数分隔符。

如何以最通用的方式检测小数点分隔符?

答案1

locale:

locale decimal_point

这将使用当前区域设置输出小数点。

如果您需要千位分隔符:

locale thousands_sep

您可以通过请求查看所有数字关键字类别LC_NUMERIC:

locale -k LC_NUMERIC

答案2

如果这是一个zshshell 脚本,您可以在模块$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

相关内容