- 桁区切り # printf # 2026-07-09
bash でわざわざ C 言語の標準ライブラリ以外から printf を引っ張ってきているってことは考え辛いし、
もしや C も locale の設定で、桁区切り出来るのでは?って、はたと思い至った。
とりあえず、
- Google 検索: C言語 set locale
- IBM Documentation / IBM i / 7.5.0 / setlocale() — ロケールの設定
ロケールを照会するには、NULL を 2 番目のパラメーターとして指定してください。 例えば、ユーザーのロケールのすべてのカテゴリーを照会するには、 次のステートメントを入力します。
char *string = setlocale(LC_ALL, NULL);みたいに書いてあったので、
#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 に丸投げしてみたところ、以下のような回答
- Microsoft Copilot / 2026-07-09: 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() 関数はプロセスのデフォルト・ロケールを使用します。みたいな事が書いてあったので、マニュアル精読しろって話ではある。
- 桁区切り # C言語 # 2026-07-09
タグ

コメントをかく