JavaScriptで数値をインド式通貨表現(Lakh・Crore対応)の英単語に変換する関数の作成方法
はじめに
本記事では、小数点以下2桁までの浮動小数点数を受け取り、その数値をインド式通貨表現(英語の単語)に変換するJavaScript関数の実装方法を解説します。
インドの数値体系では、欧米とは異なり「Thousand(千)」以降、「Lakh(ラーク=10万)」、「Crore(クロール=1,000万)」という独自の位取り単位が使用されます。そのため、一般的な英語の数値変換ロジックとは別の処理が必要になります。
実装イメージ
例えば、入力として次の数値が与えられた場合を見てみましょう。
const num = 12500;
このとき、期待される出力は以下のとおりです。
const output = 'Twelve Thousand Five Hundred';
サンプルコード
以下が実際の実装コードです。
const num = 12500;
const wordify = (num) => {
const single = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"];
const double = ["Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"];
const tens = ["", "Ten", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"];
const formatTenth = (digit, prev) => {
return 0 == digit ? "" : " " + (1 == digit ? double[prev] : tens[digit])
};
const formatOther = (digit, next, denom) => {
return (0 != digit && 1 != next ? " " + single[digit] : "") + (0 != next || digit > 0 ? " " + denom : "")
};
let res = "";
let index = 0;
let digit = 0;
let next = 0;
let words = [];
if (num += "", isNaN(parseInt(num))){
res = "";
}
else if (parseInt(num) > 0 && num.length <= 10) {
for (index = num.length - 1; index >= 0; index--) switch (digit = num[index] - 0, next = index > 0 ? num[index - 1] - 0 : 0, num.length - index - 1) {
case 0:
words.push(formatOther(digit, next, ""));
break;
case 1:
words.push(formatTenth(digit, num[index + 1]));
break;
case 2:
words.push(0 != digit ? " " + single[digit] + " Hundred" + (0 != num[index + 1] && 0 != num[index + 2] ? " and" : "") : "");
break;
case 3:
words.push(formatOther(digit, next, "Thousand"));
break;
case 4:
words.push(formatTenth(digit, num[index + 1]));
break;
case 5:
words.push(formatOther(digit, next, "Lakh"));
break;
case 6:
words.push(formatTenth(digit, num[index + 1]));
break;
case 7:
words.push(formatOther(digit, next, "Crore"));
break;
case 8:
words.push(formatTenth(digit, num[index + 1]));
break;
case 9:
words.push(0 != digit ? " " + single[digit] + " Hundred" + (0 != num[index + 1] || 0 != num[index + 2] ? " and" : " Crore") : "")
};
res = words.reverse().join("")
} else res = "";
return res
};
console.log(wordify(num));出力結果
上記のコードをコンソールで実行すると、次のような出力が得られます。
Twelve Thousand Five Hundred
コードの解説
使用している辞書配列
- single: 0〜9の1桁の数字に対応する単語
- double: 10〜19の特殊な読み(Ten、Elevenなど)
- tens: 20以上の十の位の読み(Twenty、Thirtyなど)
補助関数
- formatTenth(digit, prev): 十の位の数値を整形します。1の位が「1」の場合はdouble配列から11〜19の読みを取得し、それ以外はtens配列を使用します。
- formatOther(digit, next, denom): 桁の数字と「Thousand」「Lakh」「Crore」といった単位を組み合わせて整形します。
メイン処理の流れ
- 数値を文字列化し、有効な整数かどうかを判定します。
- 数値が正で10桁以内であることを確認したうえで、下の桁から順にswitch文で各桁の位置に応じた処理を行います。
- case 5で「Lakh」、case 7で「Crore」が付与され、インド独自の位取りに対応しています。
- 最後にwords配列を反転させて連結することで、自然な順序の英文テキストを生成します。
まとめ
このように、桁ごとに分割して辞書配列を参照するシンプルなアプローチで、インド式の数値表記(Lakh・Crore)に対応した金額の英単語変換関数を実装できます。請求書や領収書などの金額を文字表記するシステムで、ぜひ活用してみてください。
-
JavaScriptで数値と文字数が一致する文字列を検証する方法
問題文字列 str を引数として受け取るJavaScript関数を作成することを考えます。この関数は、文字列内の英字部分を、その直前にある数字に基づいて検証する必要があります。具体的には、文字列を数字で分割し、各数字とそれに続く部分文字列の文字数を比較します。すべての組み合わせが一致していれば、その文字列は有効であるとして true を返し、一箇所でも不一致があれば false を返します。例えば、以下のような文字列を見てみましょう。5hello4from2meこの文字列に対しては、true を返す必要があります。なぜなら、数字で分割すると「hello」「from」「me」という3つの部分文字
-
数字を単語に変換するCプログラム
1桁の数字 d が与えられたとき、それを対応する英語の単語に変換するプログラムを考えてみましょう。たとえば d = 5 であれば出力は「Five」になり、d = 6 であれば「Six」と表示されます。さらに、0〜9 の範囲外の値が渡された場合には、範囲外であることを示す適切なメッセージを返します。解決のアプローチこの問題は、条件分岐を使って数字ごとに対応する単語を判定するだけで解決できます。手順は次のとおりです。solve() という関数を定義し、引数として数字 d を受け取ります。d が 0 未満、または 9 より大きい場合は「Beyond range of 0 - 9」(範囲外)というメッ