Работа с цифровыми единицами в Globalize основана на стандартах CLDR (Common Locale Data Repository), где описываются правила форматирования единиц измерения, включая байты и производные величины хранения данных. Цифровые единицы рассматриваются как часть универсальной системы единиц, что позволяет библиотеке корректно отображать значения объёма данных в зависимости от локали, системы сокращений и правил множественного числа.
Механизм цифровых единиц встроен в подсистему unit formatting. В CLDR
они определяются в категории digital, включающей базовую
единицу byte и её производные:
Каждая единица содержит локализованные формы отображения:
Globalize использует эти данные для построения строк форматирования с учётом языка и правил грамматики.
Перед использованием форматирования необходимо загрузить соответствующие части CLDR:
Globalize.load(
require("cldr-data/main/ru/units"),
require("cldr-data/main/ru/numbers"),
require("cldr-data/supplemental/numberingSystems"),
require("cldr-data/supplemental/plurals"),
require("cldr-data/supplemental/likelySubtags")
);
После загрузки данных инициализируется локаль:
const Globalize = require("globalize");
Globalize.locale("ru");
Поддержка цифровых единиц зависит от наличия блока units
в данных локали.
Для работы с цифровыми значениями используется
unitFormatter. Форматирование строится вокруг базового
вызова с указанием единицы измерения.
const formatByte = Globalize.unitFormatter("byte");
formatByte(1); // "1 байт"
formatByte(5); // "5 байтов"
formatByte(1024); // "1 килобайт" (в зависимости от настроек и округления)
Форматирование учитывает правила множественного числа в языке. Для русского языка применяется сложная система склонений, что автоматически обрабатывается через CLDR plural rules.
Цифровые единицы можно задавать явно через параметр
unit. Это позволяет контролировать масштаб отображения.
const formatKB = Globalize.unitFormatter({
unit: "kilobyte"
});
formatKB(1); // "1 килобайт"
formatKB(10); // "10 килобайт"
Аналогично можно использовать более крупные единицы:
const formatMB = Globalize.unitFormatter({
unit: "megabyte"
});
formatMB(1); // "1 мегабайт"
formatMB(256); // "256 мегабайт"
CLDR поддерживает три основных стиля отображения цифровых единиц.
Полное написание единицы:
const formatLong = Globalize.unitFormatter({
unit: "gigabyte",
style: "long"
});
formatLong(2); // "2 гигабайта"
Сокращённое представление:
const formatShort = Globalize.unitFormatter({
unit: "gigabyte",
style: "short"
});
formatShort(2); // "2 ГБ"
Минимально возможная форма:
const formatNarrow = Globalize.unitFormatter({
unit: "gigabyte",
style: "narrow"
});
formatNarrow(2); // "2ГБ"
Разница между стилями определяется локальными правилами и может варьироваться в зависимости от языка.
Цифровые единицы тесно связаны с системой plural rules. В русском языке различаются формы:
Globalize автоматически применяет правильную форму без необходимости ручного управления.
const format = Globalize.unitFormatter("byte");
format(1); // "1 байт"
format(2); // "2 байта"
format(5); // "5 байтов"
Эта логика полностью делегируется CLDR, что обеспечивает согласованность между разными языками.
Хотя базовый API не всегда выполняет автоматическое преобразование между единицами, часто используется дополнительная логика для выбора подходящей единицы хранения.
Пример ручного масштабирования:
function formatBytes(value) {
const kb = 1024;
const mb = kb * 1024;
if (value < kb) {
return Globalize.unitFormatter("byte")(value);
} else if (value < mb) {
return Globalize.unitFormatter("kilobyte")(value / kb);
} else {
return Globalize.unitFormatter("megabyte")(value / mb);
}
}
Такой подход позволяет комбинировать вычислительную логику приложения с локализованным выводом.
Цифровые единицы используют числовое форматирование Globalize внутри себя. Это означает, что округление и локализация чисел применяются автоматически.
Globalize.unitFormatter({
unit: "megabyte",
maximumFractionDigits: 2
})(1.256); // "1,26 мегабайта" (в русской локали)
Параметры форматирования:
minimumFractionDigitsmaximumFractionDigitsroundingModeЦифровые единицы могут использоваться совместно с другими форматерами Globalize, например, с относительным временем или числовыми форматами, формируя комплексные представления данных.
const numberFormatter = Globalize.numberFormatter();
const unitFormatter = Globalize.unitFormatter("gigabyte");
const value = numberFormatter(3.14) + " " + unitFormatter(3.14);
Хотя подобное комбинирование редко требуется, оно демонстрирует совместимость подсистем библиотеки.
Разные языки могут по-разному трактовать цифровые единицы:
Globalize полностью опирается на CLDR, что исключает необходимость ручной настройки для каждой локали.
Система цифровых единиц в Globalize ориентирована на представление, а не на вычисления. Она не занимается:
Все подобные задачи реализуются на уровне прикладного кода, а Globalize выполняет исключительно задачу локализованного отображения.
CLDR хранит описание единиц в виде структурированных записей:
Globalize интерпретирует эти данные и формирует форматтеры на их основе. Это обеспечивает единообразие поведения во всех поддерживаемых языках без ручной настройки шаблонов.