DanLevy.net

国際数字と通貨の理解

ローカライズされたお金の解説!

お金:ローカライゼーション(L10n)とインターナショナリゼーション(i18n)

スクラブルで勝つためだけにあるわけではありません。_ローカライゼーション_と_インターナショナリゼーション_は、製品を別の国でも違和感なく使えるようにするプロセスを指します。

間違ったローカル形式で通貨を表示すると、努力をしていないことが一目瞭然です。
価格のフォーマットすらできないのに、どうやって配送を処理できるでしょうか?

インターナショナリゼーションは広大なトピックで、テキスト翻訳から日付フォーマットまで多岐にわたります。この記事では、特に数字と通貨のフォーマットというサブトピックに焦点を当てます。

ユーロ圏の3カ国、アメリカ、インドの間でのフォーマットの違いを見てみましょう:

カオスだ! そうだろう? 記号、空白、句読点が飛び交っている! EUが何かで合意できるなんて驚きだ! 😅

重要な概念

解決策に飛び込む前に、「数字はローカル」とはどういう意味かを理解しよう。

数字はローカル 🏘️

すべてのロケール(ISO 3166 による国コード)は、数字のフォーマットに関するルールを定義している。

数値フォーマットのルールには以下が含まれる:

通貨はグローバル 🌎

currency(通貨)は特定の貨幣単位を指す。(一覧はISO 4217を参照。)

ロケールが重要になる場面

ほとんどのEC・決済系REST APIは price + currencyCode を扱う。なぜロケールが含まれないのか?

ロケールは(通常)OS/デバイスレベルで設定され、ブラウザは navigator.language でそれを利用可能にする。ユーザーごとに異なるロケールを持ちうる以上、数値や通貨のフォーマットはクライアント側で行うのが筋である。

解決策

さて、朗報だ。現代のプログラミング言語にはこのための組み込みサポートがある。JavaScript では Intl クラスと Intl.NumberFormat が使える!

実際のコードを見てみよう。

const number = 1_234_567.89;
/**
* 数値を現地通貨でフォーマットする。
* @param {number} amount - フォーマットする金額。
* @param {string} currency - 3文字の通貨コード。
* @param {string} [locale] - ユーザーのロケール文字列。
*/
const formatMoney = (amount, currency, locale = navigator.language) =>
new Intl.NumberFormat(locale, { currency, style: 'currency' })
.format(amount);
console.log('🇩🇪 ' + formatMoney(number, 'EUR', 'de-DE'));
console.log('🇮🇪 ' + formatMoney(number, 'EUR', 'ga-IE'));
console.log('🇫🇷 ' + formatMoney(number, 'EUR', 'fr-FR'));

税金の計算、割引の適用、通貨間の変換など、より高度な処理が必要なら、dinero.js のようなライブラリを使うとよい。

次のステップ

具体的なニーズに応じて、以下の関連概念を掘り下げるとよいでしょう。

これらのトピックに関する今後の記事をご希望でしたら、お知らせください!

JavaScript / TypeScript

Rust

Go