web-dev-qa-db-ja.com

現在の小数点記号はどれですか?

たとえば、次のようなPOSIXシェルスクリプトがあるとします。

  1. 私が制御していないさまざまなシステム/環境で実行する必要がある
  2. ロケール設定を尊重するプログラムによって出力される文字列から小数点を削除する必要があります。

最も一般的な方法で小数点記号を検出するにはどうすればよいですか?

29
gboffi

質問 locale

locale decimal_point

これにより、現在のロケール設定を使用して小数点が出力されます。

桁区切り記号が必要な場合:

locale thousands_sep
43
Stephen Kitt

それがzshシェルスクリプトの場合、_$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シェルを使用して、ユーザーのロケール形式から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
_
6