読者です 読者をやめる 読者になる 読者になる

数字をコンマ区切りにする (140文字ver.)

JavaScript です。

Number.prototype.toStringSeparatedByCommas =
// 以下140字
function(){for(var n=this,a=""+~~n,b=(""+n).substr(a.length),e=RegExp("(\\d)(\\d{3})(,|$)");e.test(a);a=a.replace(e,"$1,$2$3"));return a+b};

問題点

  • 整数にするのにビット演算を使っているのであまり大きい値は扱えない
    • でも普通の Number.toString で指数表示になるときの扱いは?

書き下すと

Number.prototype.toStringSeparatedByCommas = function() {
    var n = this;
    // 小数点より上の文字列
    var a = "" + parseInt(n);
    // 小数点以下の文字列を切り出す
    var b = ("" + n).substr(a.length);
    // 4桁以上の数字が連続していたら区切り文字を挿入
    var e = RegExp("(\\d)(\\d{3})(,|$)");
    while (e.test(a)) {
        a = a.replace(e, "$1,$2$3"));
    }
    return a + b;
};

区切り文字や桁数を変えられるようにすると

Number.prototype.toStringWithSeparator = function() {
    var separator = (typeof arguments[0] == "string") ? arguments[0] : ",";
    var m = parseInt(arguments[1]);
    m = (m >= 1) ? m : 3;
    var n = this;
    var a = "" + parseInt(n);
    var b = ("" + n).substr(a.length);
    // とりあえず区切り文字に使われそうな “.” だけをエスケープ
    var e = RegExp("(\\d)(\\d{" + m + "})(" + separator.replace(/[.]/g, "\\$0") + "|$)");
    while (e.test(a)) {
        a = a.replace(e, "$1" + separator + "$2$3"));
    }
    return a + b;
};

小数点以下もしたい!(あとでやる|誰かやって
Number.toString の小数点ってロケールによって変わるのかな?