【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を指定することで、空文字列や予期しない入力に対しても安全に動作します。
この手法は、音声認識結果やテキストデータから数値情報を抽出したい場合など、さまざまな場面で応用できる便利なテクニックです。
-
JavaScriptで単語を区切らずに文字列を固定長のブロックへ分割する方法
JavaScriptで、段落のテキストを含む文字列を第1引数に、チャンクサイズ(分割する長さ)を数値で第2引数に受け取る関数を作成する必要があります。この関数には、次のような動作が求められます。文字列を、指定されたチャンクサイズ(第2引数)を超えない長さのかたまりに分割する分割は空白(スペース)または文末でのみ行い、単語の途中で切らない具体例たとえば、入力が次の場合を考えてみましょう。const str = this is a string; const chunkLength = 6;このとき、期待される出力は次のとおりです。const output = [this, is a, strin
-
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