2017.10.25
2020.5.21

数値を3桁区切りのカンマ文字列にフォーマット

JavaScirptで金額などの数値を3桁区切りのカンマ文字列にフォーマットする方法です。

目次

  • コード
  • 動作確認
  • 参考リンク

コード

3桁区切りのカンマ文字列にフォーマットする関数の例。


// フォーマット(カンマ)
function formatComma(v) {

  // 数値のチェック
  if(v == null || !v.toString().match(/^[+-]?[0-9.]+$/)){
    return v;
  }

  // 整数部と小数部を分離
  var arr = v.toString().split(".");

  // 整数部のフォーマット
  var rtn = arr[0].replace(/\B(?=(\d{3})+$)/g, ",");

  // 小数部の連結
  if(arr[1] != null){
    rtn += "." + arr[1];
  }

  return rtn;
};

上記のコードは小数を含んだ数値にも対応しています。

実際に整数部の数値をフォーマットしているのは以下のコード。

[string].replace(/\B(?=(\d{3})+$)/g, ",");

重要なポイントは文字列の末尾のマッチ $ は指定していますが、先頭のマッチ ^ は指定していない点。

末尾のマッチのみを指定した上で、?= を使った先読みを利用すると、右側の桁から3桁毎 (?=(\d{3})+ にカンマが挿入されます。

先読みを利用した正規表現は、実際に使ってみて動作に慣れないと分かり難いと思います。

また、先頭の「\B」も重要で、これがない場合は、3桁や6桁などの桁数の数値で先頭にカンマが追加されてしまいます。(123 ⇒ ,123、123456 ⇒ ,123,456)

「\B」はイメージしにくいですが、「\b」の否定表現と覚えておくと分かりやすく、「\b」や「\B」は文字の境界を表します。

「oar」という単語を例にすると、「\b」と「\B」がマッチする箇所は以下の通り。

  • 「o」の前)\b
  • 「o」と「a」の間)\B
  • 「a」と「r」の間)\B
  • 「r」の後)\b

つまり、上述の「/\B(?=(\d{3})+$)/g」という正規表現では、「123」や「123456」は「1」の左側に「\B」がないので、その位置にカンマは挿入されませんが、「1234」や「1234567」は「1」と「2」の間に「\B」があるので、カンマが挿入されます。

なお、「\b」や「\B」でマッチした部分は文字ではなく境界なので、長さは0となります。この点は結構重要で、先読み同様にreplace()メソッドで数値を置換してしまわないためにも、この指定の仕方が必要です。

動作確認

上記の関数を利用して動作確認してみた結果は以下の通り。


console.log(formatComma(1234567890));    // 1,234,567,890
console.log(formatComma(-1234567890));   // -1,234,567,890
console.log(formatComma(1234.5));        // 1,234.5
console.log(formatComma(0.1234));        // 0.1234
console.log(formatComma(0));             // 0
console.log(formatComma(1));             // 1
console.log(formatComma(12));            // 12
console.log(formatComma(123));           // 123
console.log(formatComma(1234));          // 1,234
console.log(formatComma(12345));         // 12,345
console.log(formatComma(123456));        // 123,456
console.log(formatComma(1234567));       // 1,234,567
console.log(formatComma(null));          // null
console.log(formatComma(undefined));     // undefined
console.log(formatComma("テスト1234"));  // テスト1234

大丈夫そうですね。

コード例で示した関数はあくまでサンプルで、整数しか処理しないのであれば、もっと単純にできます。

参考リンク

JavaScript】関連記事