setlocale

setlocaleでロケールを取得したり、設定できる。

Man page of SETLOCALE
C言語辞典 setlocale()
C言語辞典 localeconv()

これ1つで設定と取得ができるが、使い方がわかりにくく、理解してなかった部分もあったので改めて。

実行すると、デフォルトのロケールが"C"ロケールになるので、それを確認するために、現在のロケール情報を出力。
setlocaleで第2引数にNULLをセットすると、変更せずに現在のロケール文字列を返す。
LC_ALLは全体としてどのロケールかを指定したもの。

通貨(LC_MONETARY)だけ日本("Japanese")に設定する。
そして、通貨のロケール文字列と全体のロケール文字列を出力。

で、実は"Japanese"だと通貨記号(currency_symbol)が文字化けする。

localeを日本語(ja_JP.UTF-8)にする - Qiita

なのでUTF-8を指定して改めて設定。

実行すると、

$ vi setlocale.c
$ gcc setlocale.c -o setlocale
$ ./setlocale
lc->decimal_point = .
lc->thousands_sep =
lc->currency_symbol =
current = C

current = Japanese
lc->decimal_point = .
lc->thousands_sep =
lc->currency_symbol = ��
monetary = Japanese
all = LC_CTYPE=C;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=C;LC_MONETARY=Japanese;LC_MESSAGES=C;LC_PAPER=C;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C

current = ja_JP.UTF-8
lc->decimal_point = .
lc->thousands_sep =
lc->currency_symbol = ¥
monetary = ja_JP.UTF-8
all = LC_CTYPE=C;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=C;LC_MONETARY=ja_JP.UTF-8;LC_MESSAGES=C;LC_PAPER=C;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C
$

ロケール文字列は1個に統一されてるとそれだけを持ち、複数ある場合はこのように全部を持っている。

Sample/c/setlocale/setlocale/src/setlocale at master · bg1bgst333/Sample · GitHub