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

【JavaScript入門】英単語で書かれた数字列を整数に変換する方法

はじめに

本記事では、文字列を唯一の引数として受け取り、それに対応する数値を返す関数の実装方法を解説します。

たとえば、以下のような変換を行います。

one five seven eight  -------> 1578
Two eight eight eight -------> 2888

この問題は非常にシンプルです。空白文字で区切られた単語の配列を反復処理しながら、各単語に対応する数値を結果に加算していけばよいのです。

実装の考え方

まず、0から9までの英語表記を格納した配列(レジェンド)を用意します。次に、入力文字列を小文字に変換してから空白で分割し、reduceメソッドを使って各単語を順番に処理します。

具体的には、以下の手順で処理を進めます。

  • 文字列をtoLowerCase()ですべて小文字に統一する
  • split(" ")で単語ごとに配列へ分割する
  • reduceで累積値を「現在の累積値 × 10 + 対応する数字」として更新する

このように桁を一つずつずらしていくことで、複数桁の整数として組み立てられます。

サンプルコード

実際のコードは以下のとおりです。

const wordToNum = (str) => {
    const legend = ['zero', 'one', 'two', 'three', 'four', 'five', 'six','seven', 'eight', 'nine'];
    return str.toLowerCase().split(" ").reduce((acc, val) => {
        const index = legend.indexOf(val);
        return (acc*10 + index);
    }, 0);
};
console.log(wordToNum('one five six eight'));
console.log(wordToNum('zero zero two zero eight'));
console.log(wordToNum('eight six seven five'));

実行結果

コンソールには次のように出力されます。

1568
208
8675

コードのポイント

  • 大文字・小文字の対応: toLowerCase()によって、「Two」のような大文字混在の入力にも柔軟に対応できます。
  • 先頭のゼロ: 「zero zero two zero eight」のように先頭がゼロの場合でも、計算上は自然に無視され、正しく「208」が出力されます。
  • 初期値: reduceの第2引数に0を指定することで、空文字列や予期しない入力に対しても安全に動作します。

この手法は、音声認識結果やテキストデータから数値情報を抽出したい場合など、さまざまな場面で応用できる便利なテクニックです。

  1. JavaScriptで単語を区切らずに文字列を固定長のブロックへ分割する方法

    JavaScriptで、段落のテキストを含む文字列を第1引数に、チャンクサイズ(分割する長さ)を数値で第2引数に受け取る関数を作成する必要があります。この関数には、次のような動作が求められます。文字列を、指定されたチャンクサイズ(第2引数)を超えない長さのかたまりに分割する分割は空白(スペース)または文末でのみ行い、単語の途中で切らない具体例たとえば、入力が次の場合を考えてみましょう。const str = this is a string; const chunkLength = 6;このとき、期待される出力は次のとおりです。const output = [this, is a, strin

  2. JavaScriptで数式を英単語の読み方に変換する関数の実装方法

    問題 数式を表す文字列(例:「5 - 8」)を受け取り、その式を英語の単語による読み方(例:「Five Minus Eight」)に変換して返すJavaScript関数を作成します。 対応する演算子は以下の通りです。 + : Plus(足す) - : Minus(引く) * : Times(掛ける) / : Divided By(割る) ** : To The Power Of(累乗) = : Equals(等しい) != : Does Not Equal(等しくない) 扱う数値は1から10までです。もし入力された演算子が上記のリストに存在しない場合は、「Thats not an ope