JavaScriptで変換メソッドを使わずに数値文字列同士を足し算する方法
本記事では、2つの数値文字列を受け取り、Number() や parseInt() などの変換メソッドに頼らずに合計値を計算するJavaScript関数を作成します。大きな数値を扱う際に数値型への変換による精度落ちを避けたい場合などに役立つテクニックです。
要件の確認
たとえば、次のような入力が与えられたとします。
const str1 = '123'; const str2 = '456';
この場合、期待される出力は次のとおりです。
const output = '579';
アプローチ:筆算と同じ考え方で桁ごとに加算する
学校で習った筆算と同じ要領で、一番右の桁(1の位)から順に1桁ずつ加算していきます。各桁の合計が9を超えたら「繰り上がり(carry)」として次の桁へ持ち越すのがポイントです。
各文字の数値そのものは、String.prototype.charCodeAt() を使って文字コードから導き出せます。文字 '0' の文字コードは 48 なので、「文字コード − 48」で対応する数値(0〜9)が得られます。この方法なら、入力文字列を数値に変換するメソッドは一切不要です。
実装コード
const str1 = '123';
const str2 = '456';
const addStrings = (num1, num2) => {
// 常に長い方を num1 にしておく
if (num1.length < num2.length) {
[num1, num2] = [num2, num1];
}
let n1 = num1.length;
let n2 = num2.length;
const arr = num1.split('');
let carry = 0;
// 右端の桁から左へ向かって処理
for (let i = n1 - 1, j = n2 - 1; i >= 0; i--, j--) {
// 文字コード('0' は 48)から各桁の数値を求める
const d1 = num1.charCodeAt(i) - 48;
const d2 = j >= 0 ? num2.charCodeAt(j) - 48 : 0;
const total = d1 + d2 + carry;
if (total > 9) {
arr[i] = String(total - 10);
carry = 1;
} else {
arr[i] = String(total);
carry = 0;
}
}
// 最上位での繰り上がりが残っていれば先頭に '1' を追加
return carry > 0 ? '1' + arr.join('') : arr.join('');
};
console.log(addStrings(str1, str2));出力結果
コンソールには次のように出力されます。
579
コードのポイント
- 桁数の調整: あらかじめ長い方の文字列を
num1にすることで、ループの終了条件がシンプルになります。 - 文字コードからの数値取得:
charCodeAt(i) - 48により、parseInt等を使わずに1桁分の数値を取り出せます。 - 繰り上がりの管理: 各桁の合計が10以上の場合は、一の位だけを配列に格納し、
carryを 1 にして次の桁へ引き継ぎます。 - 最終的な繰り上がり: ループ終了後も
carryが残っていれば(例:'999' + '1'のようなケース)、先頭に'1'を付けて返します。
この手法は Number.MAX_SAFE_INTEGER を超える巨大な整数同士の加算にも対応できるため、実務でも応用範囲が広いアルゴリズムです。
-
JavaScriptのテンプレート文字列を使ってフォーマット済み文字列を作成する方法
JavaScriptでは、テンプレート文字列(テンプレートリテラル)を使用することで、変数や式を埋め込んだフォーマット済み文字列を簡単かつ直感的に作成できます。通常のシングルクォートやダブルクォートの代わりに、バッククォート(`)で文字列を囲み、${ } の中に変数名や式を記述するだけで、その評価結果が自動的に文字列へ挿入されます。従来の文字列連結(+ 演算子)と比べると、コードが読みやすくなり、複雑な文字列の組み立てもミスなく行えるのが大きなメリットです。以下は、テンプレート文字列を使ってオブジェクトの値を埋め込んだフォーマット済み文字列を作成するコード例です。サンプルコード<!DOC
-
JavaScriptのオブジェクト配列に配列メソッドを適用する方法
JavaScriptでは、オブジェクトが格納された配列に対しても、通常の配列と同じようにpop()、push()、splice()などの標準的な配列メソッドをそのまま使用できます。オブジェクト配列はあくまで「配列」であるため、要素としてオブジェクトが入っていても配列操作のAPIは共通で動作します。 コード例 以下は、JavaScriptオブジェクトの配列に対して配列メソッドを使用するサンプルコードです。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8