Получить символ валюты для локали - PullRequest
0 голосов
/ 01 июня 2018

Как получить символ валюты для данной строки валюты («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 Ответ

0 голосов
/ 12 декабря 2018

Это выглядит как большая работа, чем на самом деле, когда вы включаете весь селектор 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 (на самом деле).Если вы получите значение валюты без десятичных знаков или разделителей, просто удалить цифры и оставить только символ.Вы захотите использовать такой подход, потому что, в зависимости от локали и валюты, символ не всегда является одним символом.Например:

getCurrencySymbol('en-US', 'CNY') // CN¥
getCurrencySymbol('zh-CN', 'CNY') // ¥

Обрезка результата также хорошая идея.Вы можете связать .trim() с результатом, как в примерах, или обновить регулярное выражение для включения пробелов.Следует отметить, что это несколько наивный подход, поскольку он работает только для цифр 0-9.Если вам нужно было включить другие числовые символы, такие как арабский (,), вам нужно обновить регулярное выражение, чтобы включить диапазоны Юникода: /[0-9\u0660-\u0669]/g.Вам придется добавить любую другую систему счисления, которую вам нужно поддерживать, аналогичным образом.

Локализация - нетривиальная проблема, поэтому может иметь смысл использовать код валюты для обозначения карты, например * 1016.* этот .

...