是非はさておき、この程度なら国粋主義に走るよりプログラムを走らせた方が健全だと思う。

Life is beautiful: 素直な疑問:数字には四桁ごとにテンを打った方が日本人には読みやすくないか?
今になって考えてみれば、その教師は「確かに君の指摘するように日本人にとっては四桁ごとにテンを打った方が読みやすい。でもね、英語やフランス語などの欧米の言語の場合は3桁ごとにテンを打ったほうが読みやすいんだ。戦争に負けて、欧米を中心にしたグローバル経済圏に取り込まれた日本はそれに従うしかないんだ。不便だけれど我慢してくれ。」と答えるべきだったのだが

で、具体的な方法。まずはperlの場合、

#!/usr/local/bin/perl
use strict;
use warnings;
use Getopt::Std;

getopts("34" => \my %Opt);

my $commify = sub{
    my $dgc = shift;
    my $re_digit  = qr/([0-9]+)([0-9]{$dgc})/;
    warn $re_digit;
    sub {
        my $str = shift;
        $str =~ s/([0-9]+),([0-9]+)/$1$2/g;
        1 while $str =~ s/$re_digit/$1,$2/g;
        $str;
    }
}->($Opt{4} ? 4 : $Opt{3} ? 3 : 3);

print $commify->($_) while(<>);

関数を生成する関数を使ったのは、JavaScript化への布石。

もっとfancyなことをしたければNumber::Formatをご利用ください、と書きかけてPODを見たら、なぜか桁数だけ3桁で決め打ちみたい。どなたかPatch送ってあげてちょんまげ(おまえやれってか)。

そのJavaScript版は以下のとおり。

3桁区切り 4桁区切り
function commify(dpc){
  var re_digit = new RegExp('([0-9]+)([0-9]{' + dpc + '})', 'g');
  alert(re_digit);
  return function(str){
    str = str.replace(/([0-9]),([0-9])/g, function(m0,m1,m2){ return m1 + m2 });
    while(str.match(re_digit)){
      str = str.replace(re_digit, function(m0,m1,m2){ return m1 + ',' + m2 });
    };
    return str;
  };
};

区切り桁数の感想を言うと、戦争うんぬん抜きにしてもアラビア数字の区切りの三桁化は進んだと思う。SIの接頭辞がやはり三桁区切りだし、日常目にする数値のほとんどは一億以下なので、3桁区切りの方が区切りのありがたみがより強く感じられるので。

ちなみにPerlの数値リテラルは,の代わりに_で、かつ任意の場所で区切ることができる。4桁区切りがありがたいのは16進法の時、0xde_adb_eefより0xdead_beefの方がわかりやすい。

Dan the Digital Being