3 桁ごとにカンマで区切る

3桁ごとにカンマで区切る - みずぴー日記にインスパイヤされて、awk を使って 3 桁ごとにカンマで区切ります。 「プログラミング言語 AWK」を読まれた方であれば、addcomma() という関数で紹介されていますし、同じものの紹介で、再帰的にカンマで区切る関数を呼び出していくというものです。
#! /usr/local/bin/nawk -f
# sep_by_comma.awk
# 3 桁ごとにカンマで区切る
# usage: nawk -f sep_by_comma.awk num
BEGIN {
num = ARGV[1] ? ARGV[1] : 123456789;
print sep_by_comma(num);
}
# sep_by_comma(): 3 桁ごとにカンマで区切る
# in: 整数 (x)
# out: 3 桁ごとにカンマで区切られた数
# Ref: 「プログラミング言語AWK」
# http://www.amazon.co.jp/exec/obidos/ASIN/4775302493
function sep_by_comma(x, num) {
if (x < 0) {
return "-" sep_by_comma(-x);
}
num = sprintf("%.2f", x);
while (num ~ /[0-9][0-9][0-9][0-9]/) {
sub(/[0-9][0-9][0-9][,.]/, ",&", num);
}
return num;
}
実行してみましょう。
$ gawk -f sep_by_comma.awk 123,456,789.00
とこのようにカンマで区切られるわけですが、正規表現の部分が繰り返しになっているので、少し何とかしてみましょう。 具体的には以下のようにしますが、gawk などに限定されます。
#! /usr/local/bin/gawk -f
# sep_by_commai_2.awk
# 3 桁ごとにカンマで区切る
# usage: gawk -f sep_by_comma.awk num
BEGIN {
num = ARGV[1] ? ARGV[1] : 123456789;
print sep_by_comma(num);
}
# sep_by_comma(): 3 桁ごとにカンマで区切る
# in: 整数 (x)
# out: 3 桁ごとにカンマで区切られた数
# Ref: 「プログラミング言語AWK」
# http://www.amazon.co.jp/exec/obidos/ASIN/4775302493
function sep_by_comma(x, num) {
if (x < 0) {
return "-" sep_by_comma(-x);
}
num = sprintf("%.2f", x);
while (num ~ /[0-9]{4}/) { # <- ここの正規表現
sub(/[0-9]{3}[,.]/, ",&", num); # <- ここの正規表現
}
return num;
}
実行してみますが、gawk の場合には re-interval オプションを付けます。
$ gawk --re-interval -f sep_by_comma_2.awk 123,456,789.00
また、Busybox の awk の場合には、そのまま実行できます。
$ busybox awk -f sep_by_comma_2.awk 123,456,789.00




