hack のためのネタ帳, etc,,,

×

状況

で、LANG に ja_JP を設定しているか否かで bash の printf で "%'d" による桁区切りが出来るか出来ないかが決まるというのに気が付いて、
bash でわざわざ C 言語の標準ライブラリ以外から printf を引っ張ってきているってことは考え辛いし、
もしや C も locale の設定で、桁区切り出来るのでは?って、はたと思い至った。

とりあえず、 を見つけ、流し読みしたところ、
ロケールを照会するには、NULL を 2 番目のパラメーターとして指定してください。 例えば、ユーザーのロケールのすべてのカテゴリーを照会するには、 次のステートメントを入力します。
char *string = setlocale(LC_ALL, NULL);
みたいに書いてあったので、

ts.c

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main()
{
  char *locale = setlocale(LC_ALL, NULL);
  printf("locale : %s\n", locale);
  printf("%'d\n", 123456789);
  return EXIT_SUCCESS;
}
みたいなコードを書いてみたんだが、
$ gcc -o ts ts.c
$ ./ts
locale : C
123456789
$ LANG=ja_JP ./ts
locale : C
123456789
みたいな感じで、環境変数 LANG で設定した locale が反映されない。

面倒なので、Microsoft Copilot に丸投げしてみたところ、以下のような回答 曰く setlocale(LC_ALL, "") を呼んどけとの事だったので、

ts.c

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main()
{
  setlocale(LC_ALL, "");
  char *locale = setlocale(LC_ALL, NULL);
  printf("locale : %s\n", locale);
  printf("%'d\n", 123456789);
  return EXIT_SUCCESS;
}
みたいにしてみると、
$ ./ts
locale : C.UTF-8/ja_JP.UTF-8/C.UTF-8/C.UTF-8/C.UTF-8/C.UTF-8
123456789
$ LANG=ja_JP ./ts
locale : ja_JP/ja_JP.UTF-8/ja_JP/ja_JP/ja_JP/ja_JP
123,456,789
のように、無事、桁区切り出来たのであった。

まぁ、上記、IBM のドキュメントを精読すると、
#include <locale.h>
char *setlocale(int category, const char *locale);
に対して、
locale の値が "" の場合、 setlocale() 関数はプロセスのデフォルト・ロケールを使用します。
みたいな事が書いてあったので、マニュアル精読しろって話ではある。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます

広告募集中