2007年01月31日 13:30 [Edit]

perl+javascript - 1,234,567,890を12,3456,7890に

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

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


この記事へのトラックバックURL

この記事へのトラックバック
お金の表示で、3桁に区切って表示する場合があるが、一体どうすればいいのだろう?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 …
[JavaScript]3桁区切り【Bugle Diary】at 2012年04月29日 22:45
http://blog.livedoor.jp/dankogai/archives/50752956.html Rubyで書いてみた。 def commify(dpc) re_digit = Regexp.new("([0-9]+)([0-9]{#{dpc}})") Proc.new{|str| str = str.gsub(/([0-9]),([0-9])/, "\\1\\2") true while str.gsub!(re_digit, "\\1,\\2") ...
1,234,567,890を12,3456,7890に【カメログ】at 2007年02月01日 13:49
この記事へのコメント
「ぺ」さん、
そうで_す。
#でも、手元のdraftではそうなっている。なんでだろ?
Dan_the_Typo_Gene_rator
Posted by at 2007年01月31日 15:49
> 0xdead_beefより0xdead_beef
0xde_adb_eefより0xdead_beef ?
Posted by ぺ at 2007年01月31日 15:43