Механизм разбора валютных значений в Globalize основан на данных CLDR (Unicode Common Locale Data Repository). Без предварительной загрузки соответствующих фрагментов локали корректный парсинг невозможен, поскольку библиотека не содержит встроенных правил форматирования чисел и валют.
Для работы с валютами требуются следующие категории данных:
Типичная инициализация включает загрузку CLDR-данных и локали:
import Globalize from "globalize";
Globalize.load(
require("cldr-data/supplemental/likelySubtags"),
require("cldr-data/main/ru/numbers"),
require("cldr-data/main/ru/currencies"),
require("cldr-data/supplemental/currencyData")
);
Globalize.locale("ru");
Ключевой момент: парсинг валют зависит от локали, поскольку формат чисел и расположение символа валюты различаются.
Globalize не предоставляет отдельной универсальной функции
parseCurrency. Вместо этого используется общий механизм
парсинга чисел с учётом формата валюты:
const parser = Globalize.numberParser({
style: "currency",
currency: "USD"
});
parser("$1,234.56"); // 1234.56
Важная особенность: парсер создаётся под конкретную валюту и локаль, после чего становится оптимизированным и переиспользуемым.
Основные принципы:
Формат валютной строки определяется локалью, а не валютой как таковой.
Примеры различий:
$1,234.561 234,56 ₽1.234,56 €Globalize учитывает:
Пример:
Globalize.locale("ru");
const parser = Globalize.numberParser({
style: "currency",
currency: "RUB"
});
parser("1 234,56 ₽"); // 1234.56
В CLDR валюты представлены двумя основными способами:
Globalize не полагается только на символ, поскольку он может быть
неоднозначным. Например, $ используется для нескольких
валют.
Поэтому корректная конфигурация всегда должна явно указывать валюту:
Globalize.numberParser({
style: "currency",
currency: "USD"
});
Если входные данные содержат разные валюты, требуется создание нескольких парсеров или предварительная нормализация строк.
Парсинг валютных значений тесно связан с правилами форматирования чисел.
Globalize учитывает:
, в большинстве европейских локалей. в англоязычных локаляхПример:
Globalize.locale("de");
const parser = Globalize.numberParser({
style: "currency",
currency: "EUR"
});
parser("1.234,56 €"); // 1234.56
В валютных данных встречаются два основных формата отрицательных значений:
-1 234,56 ₽
(1 234,56 ₽)
Globalize учитывает оба варианта при наличии корректных CLDR-данных.
Пример:
const parser = Globalize.numberParser({
style: "currency",
currency: "USD"
});
parser("($1,234.56)"); // -1234.56
parser("-$1,234.56"); // -1234.56
Особенность заключается в том, что учетный формат активируется через дополнительные правила локали.
Парсеры в Globalize являются тяжёлыми в создании, но дешёвыми в использовании после инициализации. Поэтому типичная практика — кэширование функций.
const parseUSD = Globalize.numberParser({
style: "currency",
currency: "USD"
});
const parseEUR = Globalize.numberParser({
style: "currency",
currency: "EUR"
});
Дальнейшее использование:
parseUSD("$10,000.00");
parseEUR("10.000,00 €");
Рекомендуемая модель:
Смена локали полностью изменяет правила интерпретации строки.
Globalize.locale("en");
const parserEN = Globalize.numberParser({ style: "currency", currency: "USD" });
Globalize.locale("ru");
const parserRU = Globalize.numberParser({ style: "currency", currency: "USD" });
Хотя валюта одна и та же, строки будут интерпретироваться по-разному:
parserEN("$1,234.56")parserRU("1 234,56 $")Это связано с тем, что Globalize опирается на локализованные шаблоны CLDR.
Перед парсингом часто требуется подготовка строки:
Пример нормализации:
function normalize(input) {
return input
.replace(/\u00A0/g, " ")
.replace(/\s+/g, " ")
.trim();
}
После нормализации строка становится предсказуемой для парсера.
parserUSD("1 234,56 €"); // некорректно интерпретируется или дает NaN
Без данных валюты парсер не распознаёт символы.
Globalize.locale("en");
parser("1 234,56 €"); // ошибка интерпретации
Комбинации вроде:
$1.234,56
являются неоднозначными и требуют предварительной очистки.
Парсинг валютных значений может стать узким местом при массовой обработке данных. Основные оптимизации:
Эффективная схема:
Некоторые валюты имеют нестандартные форматы:
Пример:
const parserJPY = Globalize.numberParser({
style: "currency",
currency: "JPY"
});
parserJPY("¥1,000"); // 1000
Для таких валют важно учитывать, что:
В реальных данных часто встречаются строки, содержащие:
Пример:
≈ $1,234.56 USD
Перед парсингом требуется извлечение числовой части или применение строгих правил фильтрации, поскольку Globalize не выполняет семантический анализ текста — только структурный разбор форматированной строки.