BLOGTIMES
2013/05/23

シェルスクリプトで数字を3桁ごとのカンマ区切りにする

  sh  c  i18n 
このエントリーをはてなブックマークに追加

数値を扱うシェルスクリプトを書いていたのですが、扱う数値の桁が大きくなってくると読みにくかったりします。
これを解消するために3桁ずつのカンマ区切りにできないかなと思って調べてみたところ、あっさり解決する方法を見つけたのでメモ。

具体的な方法は printf を使うだけ。ただし、ロケール依存なのできちんと環境変数を設定しておく必要があります
それにしても、フォーマットの指定で ' (シングルクォート)が使えるというのは知りませんでした。

$ export LANG=ja_JP.utf-8 ; printf "%'d\n" 1234567890 1,234,567,890 $ export LANG=C ; printf "%'d\n" 1234567890 1234567890

これは簡単なのでいろいろなところに活用できますね。

C 言語の printf() でも同じことができる

ちなみにこの printf は C 言語の printf() のラッパーみたいなものなので、Cプログラミングでも同じことができます。

Man page of PRINTF

10進数変換 (i, d, u, f, F, g, G) において、ロケール情報に指定があれば 1000 単位の区切り文字を出力する。

具体的にはロケールを考慮するようにするために下記のような感じで、setlocale() を呼び出しておく必要があります。
ちなみに "" は環境変数からロケールを設定するという意味です。

locale_test.c

#include <stdio.h> #include <locale.h> int main(void){ setlocale(LC_NUMERIC, ""); printf("%'d\n", 123456789); return 0; }

これをコンパイル、実行するとこんな感じになります。
普段あまり意識しないで使っていた printf() ですが、ちゃんとロケールに反応するようにはできてたんですね。

$ gcc locate_test.c $ LANG=C ./a.out 123456789 $ LANG=ja_JP.utf-8 ./a.out 123,456,789

    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/5819
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン