当前的十进制分隔符是哪一个?


29

说我有一个POSIX shell脚本

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

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


什么样的脚本?它在哪里运行?请更新您的问题,以便可以回答。
X田

@XTian一个通用的shell脚本,在Unix / Linux系统上运行。֎我故意以最笼统的方式提出问题,因为我对最笼统的答案感兴趣,正如我在问题的最后一行所指出的那样。
gboffi

1
@StéphaneChazelas一个POSIX脚本!老实说,我忘记了我曾经tcsh在...中使用过,哦,我的,你绝对可以说我很老!!!
gboffi

1
您不能在LC_ALL=C环境下运行字符串发射程序吗?
安赫尔

@Ángel哦,是的,我当然可以...
gboffi

Answers:


43

询问locale

locale decimal_point

这将使用当前的语言环境设置输出小数点。

如果需要千位分隔符:

locale thousands_sep

2
至少使用localeGNU中的libclocale -k LC_NUMERIC以列出LC_NUMERIC类别中的所有语言环境设置。
StéphaneChazelas

3
@Kusalananda它是POSIX的一部分。
Stephen Kitt

3
printf "%'f"对于printf支持的实现,@ muru 会这样做%f
史蒂芬·基特

2
@muru 我知道的唯一可以输出小数点分隔符的内置函数是printf,某些shell(例如dash)不支持国际化输出。在另一个答案斯特凡Chazelas解释说,在一个评论,它没有要求POSIX
gboffi

1
@StephenKitt就是这样。奇怪的是我以前没碰过它。如果我所在的系统locale不支持使用,这无济于事。
库萨兰达

6

如果是zshshell脚本,则可以$langinfozsh/langinfo模块中使用特殊的关联数组:

zmodload zsh/langinfo
radix=$langinfo[RADIXCHAR]

(对应于standard 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

最通用,是吗?tmp=$(printf %.1f 0);tmp=${tmp#0};radix=${tmp%0}
gboffi

1
@gboffi,将在printf支持%f,但不是全部的某些国际化实现中工作。%fPOSIX不要求提供支持。该printfdash例如总是使用.
斯特凡Chazelas

dash不是国际化......我刚刚发现...所以最普遍的解决方案是诉诸locale decimal_point,不是吗?
gboffi

@gboffi,可能。awk在POSIX模式下,GNU 还可以使用当前语言环境来解释数字(尽管不能处理千位分隔符)。
斯特凡·查泽拉斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.