【Perl, Javascript】数値に位取りのコンマを挿入する


ものすごく車輪の再発明な気もするが、備忘録としておいておく。

Perl クックブックのレシピ 2.16 によると、表題のことを行う関数は次のように表せる。

sub commify {
    my $text = reverse $_[0];
    $text =~ s/(\d\d\d)(?=\d)(?!\d*\.)/$1,/g;
    return scalar reverse $text;
}

これを Javascript で表すと次のようになる。

String.prototype.reverse=function(){return this.split('').reverse().join('')};
Number.prototype.commify=function(){return this.toString().reverse().replace(/(\d\d\d)(?=\d)(?!\d*\.)/g,'$1,').reverse()};
// 使用例
alert( (123456789).commify() );     // 「123,456,789」
alert( (-123456789).commify() );    // 「-123,456,789」
alert( (1234.56789).commify() );    // 「1,234.56789」

まず、Javascript では文字列を反転させる関数がないので String.prototype.reverse() としてそれを定義している(1 行目)。そして、複雑な 2 行目を解説すると……

Number.prototype.commify = function() {
    var str = this.toString();  // 数値を文字列化
    str = str.reverse();        // 反転
    str = str.replace( /(\d\d\d)(?=\d)(?!\d*\.)/g, '$1,' );

    // コンマを挿入する
    str = str.reverse();        // もう一度反転

    return str;
};
s/
    (\d\d\d)    # 3 文字の数字
    (?=\d)      # 次の文字は数字
    (?!\d*\.)   # 小数部分ではない
/
    $1,
/gx

このようになる。肝は正規表現の 4 行目で、小数部分にコンマを挿入しないようにしている。これがなければもうちょっと単純になるんだけどね。

コメントを残す