Это выглядит как большая работа, чем на самом деле, когда вы включаете весь селектор 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.* этот .