【JavaScript】数値を文字列変換せずに個々の桁へ分割する方法
本記事では、数値を唯一の引数として受け取り、その各桁に分割した結果を配列として返すJavaScript関数の実装方法を解説します。
やりたいこと
たとえば、次のような数値が入力された場合を考えてみましょう。
const num = 55678;
このとき、期待される出力は以下の通りです。
const output = [5, 5, 6, 7, 8];
ここで重要な条件がひとつあります。Number型をString型に変換してはならず、ES6の便利な関数も使用できないという制約です。つまり、toString() や split()、スプレッド構文などを使った簡単な手法は使えません。
解決アプローチ:剰余演算とMath.floor()を活用する
この問題は、数学的な演算だけでエレガントに解決できます。考え方のポイントは以下の3つです。
- 10で割った余り(
% 10) を求めると、常に一番下の桁(1の位)が取り出せる Math.floor(num / 10)で数値を10で割って小数点以下を切り捨てると、取り出した桁を「削除」できる- これらを数値が0になるまで繰り返すことで、すべての桁を抽出できる
取り出した桁は unshift() を使って配列の先頭に挿入することで、元の数値と同じ並び順になります。
サンプルコード
実際のコードは以下のようになります。
const num = 55678;
const numberToArray = (num) => {
const res = [];
while(num){
// 10で割った余り = 一番下の桁を取得
const last = num % 10;
// 配列の先頭に挿入して順序を保つ
res.unshift(last);
// 最後の桁を取り除く
num = Math.floor(num / 10);
};
return res;
};
console.log(numberToArray(num));実行結果
コンソールには次のように出力されます。
[ 5, 5, 6, 7, 8 ]
処理の流れを追ってみる
num = 55678 の場合、whileループ内では以下のように処理が進みます。
- 1周目:
55678 % 10→8を取得 → 配列は[8]→numは5567に更新 - 2周目:
5567 % 10→7を取得 → 配列は[7, 8]→numは556に更新 - 3周目:
556 % 10→6を取得 → 配列は[6, 7, 8]→numは55に更新 - 4周目:
55 % 10→5を取得 → 配列は[5, 6, 7, 8]→numは5に更新 - 5周目:
5 % 10→5を取得 → 配列は[5, 5, 6, 7, 8]→numは0になりループ終了
まとめ
文字列への変換やES6の関数に頼らなくても、剰余演算子(%)と Math.floor() を組み合わせることで、数値を個々の桁に分割して配列化できます。このテクニックは、桁ごとの合計を求める処理やパリティチェックなど、さまざまな場面で応用できるので覚えておくと便利です。
-
JavaScriptで数値の各桁の数字を一つずつ分割表示する方法
はじめに この記事では、ユーザーが入力した数値を検証し、有効な数値であればその各桁の数字を画面に一つずつ表示するJavaScriptプログラムの作り方を解説します。 動作イメージ ページ上のボタンをクリックすると入力ダイアログが開き、そこに数値を入力してOKを押すと、入力された数値の各桁が一行ずつ画面に出力される仕組みです。 例えば、入力が次のような場合—— 43354 画面には次のように表示されます。 4 3 3 5 4 完成コード HTML <!DOCTYPE html> <html> <head> &n
-
JavaScriptで単調増加する桁を持つ、指定した数以下の最大の数を求める方法
単調増加する桁(Monotonically Increasing Digits)とは 整数が「単調増加する桁」を持つとは、隣り合う任意の2つの桁 x と y の間に、常に x <= y が成り立つことを指します。たとえば 1234 や 2299 は左から右へ向かって桁が増加(または同じ)ため条件を満たしますが、332 のように「3 → 3 → 2」と減少が含まれる数は単調増加とはみなされません。 問題 今回求められているのは、数値 num を第一引数(かつ唯一の引数)として受け取るJavaScript関数を記述することです。 この関数は、num 以下の数の中から、単調増加する桁を持つ