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


29

POSIXシェルスクリプトがあるとします。

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

最も一般的な方法で小数点区切り文字を検出するにはどうすればよいですか?


どのようなスクリプトですか?どこで実行されていますか?回答できるように質問を更新してください。
X Tian

@XTian Unix / Linuxシステムで実行されている汎用シェルスクリプト。question質問の最後の行で指定したように、最も一般的な答えに興味があるので、私は意図的に最も一般的な方法で質問を提起しました。
gboffi

1
@StéphaneChazelasPOSIXスクリプト!正直なところ、私tcshは...で使用していたことを忘れていました、ああ、私の、あなたは間違いなく私が古いと言うことができます!!!
gboffi

1
LC_ALL=C環境下で文字列を生成したプログラムを実行できませんか?
アンヘル

@Ángelああ、もちろんできます...
gboffi

回答:


43

質問locale

locale decimal_point

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

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

locale thousands_sep

2
とを有する少なくともlocaleGNUからlibclocale -k LC_NUMERICLC_NUMERICカテゴリ内のリストにすべてのロケール設定。
ステファンChazelas

3
@KusalanandaそれはPOSIXの一部です。
スティーブンキット

3
@muru printf "%'f"は、printfをサポートする実装に対してそれを行い%fます。
スティーブンキット

2
@muruのみ組み込み私の知っていることを、小数点のセパレータは、あることを出力することができるprintfといくつかのシェルは、(例えば、dash)国際出力をサポートしていません。別の回答で、StéphaneChazelasはコメントで、POSIXには必要ないことを説明しました
gboffi

1
@StephenKittそうです。これまで出会ったことがないのは奇妙なことです。その使用がlocaleサポートされていないシステムにいるのは役に立ちません。
クサラナナンダ

6

それがzshシェルスクリプトの場合$langinfozsh/langinfoモジュールで特別な連想配列を使用できます。

zmodload zsh/langinfo
radix=$langinfo[RADIXCHAR]

(これは標準nl_langinfo(RADIXCHAR)にマップさman nl_langinfoれます。詳細については、システムで確認してください$langinfo[THOUSEP]。千単位の区切りについては)。

ではbash、スクリプト(もに働くだろうzsh)、あなたが使用して別のプロセスをforkせずにそれを得ることができるはず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

最も一般的なものでしょうか?tmp=$(printf %.1f 0);tmp=${tmp#0};radix=${tmp%0}
gboffi

1
@gboffi 。これは、すべてではなく、printfをサポートする一部の国際化された実装で機能し%fます。%fサポートはPOSIXでは義務付けられていません。インスタンスのためには、常に使用していますprintfdash.
ステファンChazelas

dash国際化されていない...私はちょうど...見つけたので、最も一般的な解決策は、に頼ってlocale decimal_pointいませんか?
gboffi

@gboffi、おそらく。GNU awkは、POSIXモードの場合でも現在のロケールの数値を解釈できます(ただし、千単位の区切り記号は処理しません)。
ステファンシャゼラス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.