数値文字列の整形

数値の文字列の整形をする関数を作成します。
JavaScriptで演算した結果を表示するとき、整数部の3桁ごとのカンマ区切りや、小数部の桁数を揃えたいときがあると思います。
そのようなときに役立つように、ライブラリ化しておくと便利でしょう。

1.整数3桁区切り

整数を3桁ごとにカンマで区切る関数の作成です。
引数に整数を持って実行すると、カンマで区切られた文字列を返します。
もし整数以外の値が渡された場合は、そのまま返されます。
function int3(num) {
  var arr = new Array();
  var str = "" + num;
  if (str.search(/[^0-9]/) >= 0) return str;
  for (i = 0;; i++) {
    arr[i] = str.match(/[0-9]{3}$/);
    if (!arr[i]) break;
    str = str.replace(/[0-9]{3}$/, "");
  }
  for (j = i - 1; j >= 0; j--) {
    if (str == "")  str = arr[j];
    else  str = str + "," + arr[j];
  }
  return str;
}
//関数の実行:
document.write("int3(123456789) → ", int3(123456789));
document.write("<br>int3(12345) → ", int3(12345));
document.write("<br>int3(123) → ", int3(123));
document.write("<br>int3(12345.678) → ", int3(12345.678));
実行結果:


スクリプト解説:
始めにstr.search(/[^0-9]/)のチェックで、整数文字列ではない場合は直ちにリターンします。
次に、for無限ループのなかでstr.match(/[0-9]{3}$/)により、文字列末尾の数字3桁を取り出し、str.replace(/[0-9]{3}$/, "")でその数字3桁を文字列から削除します。
このとき、3桁ごとに切り出した文字列は順に配列に収納されます。
最後に、配列から逆順に取り出しながら、","を間に挟んで連結します。
正規表現の使い方がポイントです。


2.小数部n桁丸め

文字列整形とは異なりますが、JavaScriptには小数部の丸め(四捨五入)が無いので関数を作っておきます。
第1引数に小数点を含む数値を、第2引数に小数部の桁数を与えて実行すると、指定の桁数に丸めた値を返します。
function round(num, n) {
  var tmp = Math.pow(10, n);
  return Math.round(num * tmp) / tmp;
}
//関数の実行
document.write("round(1.2345678, 3) → ", round(1.2345678, 3));
document.write("<br>round(1.2345678, 2) → ", round(1.2345678, 2));
document.write("<br>round(.12345678, 5) → ", round(.12345678, 5));
document.write("<br>round(1/3, 5) → ", round(1/3, 5));
document.write("<br>round(2/3, 5) → ", round(2/3, 5));
実行結果:


実は、この関数で整数部の丸めも実行できるのです。
桁数に負の値を指定するのです。「0」を指定すればMath.round()と同じです。
//関数の実行
document.write("round(12345678, -3) → ", round(12345678, -3));
document.write("<br>round(123456.78, -2) → ", round(123456.78, -2));
document.write("<br>round(1.2345678, -3) → ", round(1.2345678, -3));
document.write("<br>round(1234.5678, 0) → ", round(1234.5678, 0));
実行結果:


スクリプト解説:
解説の必要が無いほど簡単です。
Math.pow(10, n)で、n桁シフトするための数値を計算します。
(1桁であれば10、3桁であれば1000)
次に、変換したい数値に、先に計算した値を掛けて桁を左にシフトし、Math.round()で小数部1位を四捨五入して整数に丸めます。
その後、シフトするために掛けた値で割れば、指定桁の丸めは完了です。


3.小数部n桁揃え

小数部の桁数がn桁に満たないときは"0"を満たして、小数点以下n桁の文字列にする関数を作成します。
小数部指定桁の丸め(四捨五入)も有効です。
第1引数に小数点を含む数値を、第2引数に小数部の桁数を与えて実行すると、指定の桁数に丸め、桁が不足していれば"0"を充填して桁を揃えた値を返します。
function roundx(num, n) {
  var str = z = "";
  str = "" + round(num, n);
  if (n < 0) return str;
  for (i = 0; i < n; i++) z = z + "0";
  if (str.indexOf(".") < 0) return str + "." + z;
  str = str + z;
  return str.split(".")[0] + "." + str.split(".")[1].substring(0, n);
}
//関数の実行
document.write("roundx(1.2, 3) → ", roundx(1.2, 3));
document.write("<br>roundx(1234.56, 4) → ", roundx(1234.56, 4));
document.write("<br>roundx(1234.56789, 4) → ", roundx(1234.56789, 4));
//document.write("<br>roundx(123456789, 2) → ", roundx(123456789, 2));
document.write("<br>roundx(1234.56789, -2) → ", roundx(1234.56789, -2));
実行結果:


スクリプト解説:
round()で、与えられた数値の指定桁への丸めを行います。
ここで、「n」が負の場合(整数桁への丸め)、ここまでの結果を直ちに返します。
「n」が正の場合(少数部の丸め)、for文で揃える桁数分の"0"が連なった文字列を作り出します。
str.indexOf(".")でピリオド無と判断される場合(引数が整数)、ここで作った連続"0"の文字列を小数部として"."と共に結合して値を返します。
引数に小数部が含まれる場合は、指定桁で丸めた文字列に先に作った連続"0"の文字列を結合します。
連続"0"が結合された小数部の左から指定桁を残して右を削除すると、不足した桁に"0"が充填された文字列になります。このようにして桁揃えされた小数部と整数部を結合して復元した値を返します。

なお、str.split(".")[0]で整数部が切り出され、str.split(".")[1]では小数部が切り出されます。
・・・.substring(0, n)で、左から0番目の文字(先頭文字)からn文字を切り出すことができます。


4.整数部3桁区切りと小数部n桁揃え

整数部の3桁カンマ区切りと、小数部をn桁に揃える関数を作成します。
丸め(四捨五入)も有効です。
第1引数に小数点を含む数値を、第2引数に小数部の桁数を与えて実行すると、整数部を3桁に区切り、小数点以下を指定の桁数に丸め、"0"を充填して桁を揃えた値を返します。
function roundz(num, n) {
  var str = "";
  str = roundx(num, n);
  return int3(str.split(".")[0]) + "." + str.split(".")[1];
}
//関数の実行
document.write("roundz(1.2, 3) → ", roundz(1.2, 3));
document.write("<br>roundz(1234.56, 4) → ", roundz(1234.56, 4));
document.write("<br>roundz(1234.56789, 4) → ", roundz(1234.56789, 4));
document.write("<br>roundz(123456789, 2) → ", roundz(123456789, 2));
document.write("<br>roundz(1234.56789, -2) → ", roundz(1234.56789, -2));
実行結果:


スクリプト解説:
整数部の3桁区切りと小数部の指定桁揃えを組み合わせただけのものです。
roundx()で小数部の桁を揃えて、int3()で整数部(str.split(".")[0])の3桁区切りをします。
小数点を挟んで整数部と小数部を結合すれば変換完了です。
簡単、簡単!!


スクリプトファイル(num_str.js)のダウンロード