JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

【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. 1周目:55678 % 108 を取得 → 配列は [8]num5567 に更新
  2. 2周目:5567 % 107 を取得 → 配列は [7, 8]num556 に更新
  3. 3周目:556 % 106 を取得 → 配列は [6, 7, 8]num55 に更新
  4. 4周目:55 % 105 を取得 → 配列は [5, 6, 7, 8]num5 に更新
  5. 5周目:5 % 105 を取得 → 配列は [5, 5, 6, 7, 8]num0 になりループ終了

まとめ

文字列への変換やES6の関数に頼らなくても、剰余演算子(%)と Math.floor() を組み合わせることで、数値を個々の桁に分割して配列化できます。このテクニックは、桁ごとの合計を求める処理やパリティチェックなど、さまざまな場面で応用できるので覚えておくと便利です。

  1. JavaScriptで数値の各桁の数字を一つずつ分割表示する方法

    はじめに この記事では、ユーザーが入力した数値を検証し、有効な数値であればその各桁の数字を画面に一つずつ表示するJavaScriptプログラムの作り方を解説します。 動作イメージ ページ上のボタンをクリックすると入力ダイアログが開き、そこに数値を入力してOKを押すと、入力された数値の各桁が一行ずつ画面に出力される仕組みです。 例えば、入力が次のような場合—— 43354 画面には次のように表示されます。 4 3 3 5 4 完成コード HTML <!DOCTYPE html> <html>   <head>   &n

  2. JavaScriptで単調増加する桁を持つ、指定した数以下の最大の数を求める方法

    単調増加する桁(Monotonically Increasing Digits)とは 整数が「単調増加する桁」を持つとは、隣り合う任意の2つの桁 x と y の間に、常に x <= y が成り立つことを指します。たとえば 1234 や 2299 は左から右へ向かって桁が増加(または同じ)ため条件を満たしますが、332 のように「3 → 3 → 2」と減少が含まれる数は単調増加とはみなされません。 問題 今回求められているのは、数値 num を第一引数(かつ唯一の引数)として受け取るJavaScript関数を記述することです。 この関数は、num 以下の数の中から、単調増加する桁を持つ