Библиотека Globalize используется для интернационализации числовых данных: форматирования, парсинга и отображения чисел в соответствии с локалью. Одной из ключевых задач является корректная работа с положительными и отрицательными числами.
В разных странах отрицательные значения отображаются по-разному:
-1234.56−1 234,56(1,234.56)1 234,56-Globalize использует данные стандарта CLDR и автоматически учитывает локальные правила отображения знаков числа.
Globalize.locale("en");
const formatter = Globalize.numberFormatter();
console.log(formatter(1250));
// 1,250
Для английской локали разделителем тысяч является запятая.
Globalize.locale("ru");
const formatter = Globalize.numberFormatter();
console.log(formatter(1250));
// 1 250
В русской локали:
Globalize.locale("ru");
const formatter = Globalize.numberFormatter({
minimumFractionDigits: 2
});
console.log(formatter(1234.5));
// 1 234,50
Параметр minimumFractionDigits задаёт минимальное
количество цифр после запятой.
Globalize.locale("en");
const formatter = Globalize.numberFormatter();
console.log(formatter(-1500));
// -1,500
Для большинства локалей отрицательное число отображается со знаком минус перед числом.
Globalize.locale("ru");
const formatter = Globalize.numberFormatter({
minimumFractionDigits: 2
});
console.log(formatter(-99.5));
// -99,50
Globalize автоматически:
Globalize.locale("en");
const formatter = Globalize.numberFormatter();
console.log(formatter(-1234567.89));
// -1,234,567.89
Globalize.locale("de");
const formatter = Globalize.numberFormatter();
console.log(formatter(-1234567.89));
// -1.234.567,89
Globalize.locale("fr");
const formatter = Globalize.numberFormatter();
console.log(formatter(-1234567.89));
// -1 234 567,89
Отличия касаются:
Globalize поддерживает разные стили отображения чисел.
Globalize.locale("en");
const formatter = Globalize.numberFormatter({
style: "percent"
});
console.log(formatter(-0.25));
// -25%
Globalize.locale("ru");
const formatter = Globalize.numberFormatter({
style: "currency",
currency: "RUB"
});
console.log(formatter(-1500));
// -1 500,00 ₽
Для валют Globalize автоматически:
Форматирование — не единственная задача. Часто требуется преобразовать строку обратно в число.
Globalize.locale("ru");
const parser = Globalize.numberParser();
console.log(parser("1 250"));
// 1250
Globalize.locale("ru");
const parser = Globalize.numberParser();
console.log(parser("-1 250,75"));
// -1250.75
Globalize корректно:
После парсинга можно определить тип значения.
const value = parser("-500");
if (value < 0) {
console.log("Отрицательное число");
}
const value = parser("500");
if (value > 0) {
console.log("Положительное число");
}
const value = parser("0");
if (value === 0) {
console.log("Ноль");
}
По умолчанию положительные числа отображаются без знака
+.
Пользовательский формат позволяет изменить поведение:
const formatter = Globalize.numberFormatter({
pattern: "+#,##0;-#,##0"
});
console.log(formatter(100));
// +100
console.log(formatter(-100));
// -100
В бухгалтерии отрицательные значения часто записываются в круглых скобках.
const formatter = Globalize.numberFormatter({
pattern: "#,##0;(#,##0)"
});
console.log(formatter(-5000));
// (5,000)
Globalize.locale("en");
const formatter = Globalize.numberFormatter({
style: "percent",
minimumFractionDigits: 1
});
console.log(formatter(0.156));
// 15.6%
console.log(formatter(-0.156));
// -15.6%
Globalize.locale("en");
const formatter = Globalize.numberFormatter();
console.log(formatter(-9876543210));
// -9,876,543,210
Globalize автоматически добавляет разделители разрядов независимо от знака числа.
const formatter = Globalize.numberFormatter({
pattern: "0.###E0"
});
console.log(formatter(125000));
// 1.25E5
console.log(formatter(-125000));
// -1.25E5
const formatter = Globalize.numberFormatter({
minimumFractionDigits: 5
});
console.log(formatter(-0.00012));
// -0.00012
Такие значения особенно важны:
const locale = navigator.language;
Globalize.locale(locale);
const formatter = Globalize.numberFormatter();
console.log(formatter(-1500.5));
Формат отрицательного числа будет зависеть от языка браузера пользователя.
Globalize часто используется совместно с API Intl.
const number = -1250.75;
const intlResult = new Intl.NumberFormat("ru-RU").format(number);
console.log(intlResult);
// -1 250,75
Однако Globalize предоставляет:
parser("1,250");
Для русской локали такая строка может быть обработана некорректно, поскольку ожидается другой формат.
Globalize.locale("ru");
parser("1,234.56");
Строка соответствует английской локали, а не русской.
Перед использованием локали необходимо загрузить соответствующие данные:
Globalize.load(cldrData);
Globalize.locale("ru");
Без CLDR форматирование работать не будет.
Globalize.locale("ru");
const currencyFormatter = Globalize.numberFormatter({
style: "currency",
currency: "RUB"
});
const balance1 = 15000;
const balance2 = -3400;
console.log(currencyFormatter(balance1));
// 15 000,00 ₽
console.log(currencyFormatter(balance2));
// -3 400,00 ₽
Положительный баланс отображается стандартно, отрицательный — со знаком минус.
const formatter = Globalize.numberFormatter({
pattern: "+#,##0;-#,##0"
});
const values = [5000, -1200, 3500, -800];
values.forEach(value => {
console.log(formatter(value));
});
Результат:
+5,000
-1,200
+3,500
-800
Такой формат удобен для:
Создание форматтера — сравнительно дорогая операция.
numbers.forEach(number => {
const formatter = Globalize.numberFormatter();
console.log(formatter(number));
});
const formatter = Globalize.numberFormatter();
numbers.forEach(number => {
console.log(formatter(number));
});
Форматтер создаётся один раз и переиспользуется.
В JavaScript существует значение -0.
console.log(-0);
Globalize может отображать его как отрицательное число:
const formatter = Globalize.numberFormatter();
console.log(formatter(-0));
// -0
Проверка:
Object.is(-0, 0);
// false
const parser = Globalize.numberParser();
const a = parser("-10");
const b = parser("10");
console.log(a < b);
// true
После парсинга значения становятся обычными числами JavaScript и участвуют в математических операциях без ограничений.
Положительные и отрицательные значения часто используются:
Корректное локализованное отображение чисел влияет: