特定の通貨文字列 ("GBP"、"USD" など) の通貨記号を取得するにはどうすればよいでしょうか。私が思いついた最善の方法は途方もなく長いようです。別の方法がありますか。それとも、ルックアップ テーブルを使用する方がよいでしょうか。
const userLocale = "EN-gb";
const userCurrency = "GBP";
const withValueEl = document.querySelector(".withValue");
const withoutValueEl = document.querySelector(".withoutValue");
const valueWithCurrency = Number(0).toLocaleString(userLocale, {
style: "currency",
currency: userCurrency,
minimumFractionDigits: 2
});
const valueWithoutCurrency = valueWithCurrency.replace(Number(0).toLocaleString(userLocale, {
minimumFractionDigits: 2
}), "")
withValueEl.innerHTML = valueWithCurrency
withoutValueEl.innerHTML = valueWithoutCurrency
With value:<span class="withValue"></span><br /> Without value:<span class="withoutValue"></span><br />
ベストアンサー1
必要な機能とは関係のない DOM セレクターと値挿入ロジックをすべて含めると、実際よりも多くの作業が必要に見えます。シンボルの抽出は非常に簡単です。
const getCurrencySymbol = (locale, currency) => (0).toLocaleString(locale, { style: 'currency', currency, minimumFractionDigits: 0, maximumFractionDigits: 0 }).replace(/\d/g, '').trim()
または、es6 を使用していない場合は:
function getCurrencySymbol (locale, currency) {
return (0).toLocaleString(
locale,
{
style: 'currency',
currency: currency,
minimumFractionDigits: 0,
maximumFractionDigits: 0
}
).replace(/\d/g, '').trim()
}
オプションtoLocaleString
は冗長なので、これについてできることはあまりありません。ただし、コンストラクNumber
ターを使用する必要はありません (実際には絶対に)。小数点や区切り文字のない通貨値を取得する場合は、数字を削除して記号だけを残すのは簡単です。ロケールと通貨によっては、記号が常に 1 文字であるとは限らないため、このようなアプローチを取る必要があります。たとえば、次のようになります。
getCurrencySymbol('en-US', 'CNY') // CN¥
getCurrencySymbol('zh-CN', 'CNY') // ¥
結果をトリミングするのも良い考えです。.trim()
例のように結果に連鎖するか、正規表現を更新して空白を含めることができます。これは、0~9 の数字にしか機能しないため、やや単純なアプローチであることに注意してください。アラビア語 (٠١٢٣٤٥٦٧٨٩) などの他の数字を含める必要がある場合は、正規表現を更新して Unicode の範囲を含める必要があります。/[0-9\u0660-\u0669]/g
同様の方法で、サポートする必要がある他の数値システムを追加する必要があります。
ローカリゼーションは簡単な問題ではないので、通貨コードをシンボルマップに使う方が理にかなっているかもしれません。これです。