練習でアプリを作成しているときに作ったコード。
toLocaleString()
や正規表現は使わずに、再帰関数を使って数値文字列のカンマ区切りを実装しています。
コード
separate_commas.js
/**
* 数値文字列の整数部分のみを3桁ごとにカンマで区切る
* @param {string} str 数値文字列。
* @returns {string} 3桁ごとにカンマで区切った数値文字列
*/
const separateNumberByCommas = (str) => {
const array = str.replace("-", "").split(".");
const result = array.length > 1
? separateIntegerByCommas(array[0]) + "." + array[1]
: separateIntegerByCommas(array[0]);
return str.includes("-") ? "-" + result : result;
};
/**
* 整数文字列を3桁ごとにカンマで区切る
* @param {string} str 整数文字列。
* @returns {string} 3桁ごとにカンマで区切った整数文字列
*/
const separateIntegerByCommas = (str) => {
const len = str.length;
return len > 3
? separateIntegerByCommas(str.slice(0, len - 3)) + "," + str.slice(len - 3)
: str;
};
実行例
sample.js
console.log(separateNumberByCommas("123")); //123
console.log(separateNumberByCommas("1234")); //1,234
console.log(separateNumberByCommas("1234.")); //1,234.
console.log(separateNumberByCommas("1234.0")); //1,234.0
console.log(separateNumberByCommas("1234.5678")); //1,234.5678
console.log(separateNumberByCommas("-123456.0")); //-123,456.0
separateNumberByCommas()
で小数点以下とマイナス記号を一旦省き、separateIntegerByCommas()
で再帰的にカンマで区切っています。
再帰が終わったら、省いていた小数点とマイナス記号を再度結合します。
8行目のarray.length > 1
は小数点を省いたかどうかを判定しています。
小数点があった場合は7行目で要素数2の配列が作成されるためtrue
に、
もともと小数点が無い場合は7行目で要素数1の配列が作成されるため8行目でfalse
になります。
末尾が小数点(例:123.
)の場合は空文字が入った要素が作成されるためtrue
になります。
(array.length > 1
をarray[1]
に変えれば末尾の小数点も省けます)
toLocaleString()
や正規表現を使わなかった理由
-
0.
とか0.0
など末尾が小数点だったり小数点以下に0
しかない文字も表示できるようにしたいけど、toLocaleString()
だとこのような文字は小数点以下が省略されてしまう。 - 正規表現使えば数行で実装できるらしい、けど正規表現良く分からないし理解できてないものをコピペして使うのは避けたい。
- for文でもいいけど再帰関数の方が三項演算子使ってスマートに書ける。
あとlet
使わないで済む。