やり方
金額を漢数字で書き、読み方も示す
金額を日本語のページと同じように書き、契約書で使う大字でも書き、読み方も示します。
学習ツールで ¥1,200,000を表示するとき、学習者に「百二十万円」という書き方と「ひゃくにじゅうまんえん」という読み方も見せたいとします。書類によっては、字画を書き足して改ざんされないよう、契約書や領収書と同じ大字で金額を書く必要があります。この手順では、一つの数からこの三つを作り、人が入力しそうなどの書き方からでも数を読み取ります。
数から作る
import { readJapaneseNumber, writeJapaneseNumber } from "@johnmorrisdotca/hikidashi/numerals";
const amount = 1_200_000;
console.log(`${writeJapaneseNumber(amount)}円`); // 百二十万円
console.log(`金${writeJapaneseNumber(amount, { formal: true })}円也`); // 金百弐拾万円也(領収書の書き方)
console.log(`${readJapaneseNumber(amount)}えん`); // ひゃくにじゅうまんえん百二十万円
金百弐拾万円也
ひゃくにじゅうまんえん読み方には、学習者が覚えなければならない音の変化(300は「さんびゃく」、800は「はっぴゃく」、3,000は「さんぜん」)が入っています。ただし読むのは数だけです。円や本などの助数詞が付くと音がさらに変わることがあり(一本は「いっぽん」)、それはページの側で扱います。
入力されたものから読む
金額の入力のしかたはさまざまです。数字のこともあれば、日本語のキーボードからの全角数字、見出しのような漢字との混ぜ書き、英語のこともあります。まず日本語として読み、だめなら英語として読みます。どちらも、読めないものにはnullを返します。
import { parseEnglishNumber, parseJapaneseNumber } from "@johnmorrisdotca/hikidashi/numerals";
const readAmount = (typed: string) => parseJapaneseNumber(typed.replace(/円$/, "")) ?? parseEnglishNumber(typed);
for (const typed of ["1,200,000", "1200000", "120万", "百二十万円", "1.2 million", "120 man", "百二十万ドル"]) console.log(typed, readAmount(typed));1,200,000 1200000
1200000 1200000
120万 1200000
百二十万円 1200000
1.2 million 1200000
120 man 1200000
百二十万ドル null最後の例はnullです。「ドル」は数の一部ではなく、どの部分が数なのかを推測することはしません。
大きすぎる数と、書けない数
書くのも読むのも9,007,199,254,740,991(LARGEST_JAPANESE_NUMBER)までです。これを超えるとJavaScriptでは正確に数えられません。それより大きい数、負の数、小数にはnullが返るので、表示する前に確かめます。
import { LARGEST_JAPANESE_NUMBER, writeJapaneseNumber } from "@johnmorrisdotca/hikidashi/numerals";
for (const value of [10 ** 12, LARGEST_JAPANESE_NUMBER, 2 ** 60, -5, 0.5]) console.log(value, writeJapaneseNumber(value) ?? "正確には書けない");1000000000000 一兆
9007199254740991 九千七兆千九百九十二億五千四百七十四万九百九十一
1152921504606847000 正確には書けない
-5 正確には書けない
0.5 正確には書けないこの日本語は、まだ日本語を母語とする方の確認を受けていません。訂正を歓迎します。