Paizaの問題を解いていたら、「数字を3桁ごとにカンマ区切りする」という場面に遭遇。
最初は直感でforループを書いたけど、「もっとスマートな方法あるのでは?」と気づいたので、いくつかの解法を比較してみる。
問題概要
入力例:
123456789
出力例:
123,456,789
数値を3桁ごとにカンマ区切りで出力する。入力される数値は3の倍数。
解法①: 正規表現 .match()
を使う
const result = input.match(/.{1,3}/g).join(",");
console.log(result); // 123,456,789
🔍 ポイント
-
/
で囲まれた部分が正規表現 -
.{1,3}
で1〜3文字のグループを作る -
g
はグローバルフラグで、文字列全体に対してマッチを繰り返す
この方法のポイントは、余った文字(この例では最後の “j”)もそのまま結果に含まれる点。
.match()
で配列化し、.join(",")
でカンマを挿入・結合
✅ メリット: シンプルで短いコード
❌ デメリット: 数の先頭から3文字ずつ切るので、1,234,567
みたいなフォーマットにはならない
解法②: for
ループで手動処理
let result = "";
for (let i = 0; i < input.length; i++) {
if (i % 3 === 0 && i !== 0) result += ",";
result += input[i];
}
console.log(result); // 123,456,789
🔍 ポイント
- 3文字ごとに
if
でカンマを挿入 - シンプルで可読性が高い
✅ メリット: 直感的で理解しやすい
❌ デメリット: カスタマイズ性が低い
解法③: .split()
と .map()
を活用
const result = input.split("").map((char, index) =>
(index % 3 === 0 && index !== 0 ? "," : "") + char).join("");
console.log(result); // 123,456,789
🔍 ポイント
-
.split("")
で配列化し、.map() でカンマを追加 -
.join("")
で連結
✅ メリット: 配列操作に慣れている人なら直感的
❌ デメリット: ちょっと冗長
まとめ
短さ優先 → match()
を使う
初心者向け → for
ループ で素直に書く
応用力重視 → split()
& map()
を使う