В основе работы с массой и весом в Globalize лежат данные CLDR (Unicode Common Locale Data Repository), где каждая единица измерения описывается как часть международной системы единиц с локализованными названиями, правилами множественного числа и форматами отображения.
Масса в CLDR представляется через стандартные идентификаторы единиц:
Globalize не выполняет физические преобразования автоматически; библиотека отвечает исключительно за корректное представление значений в зависимости от локали.
Перед использованием форматирования массы необходимо загрузить соответствующие CLDR-данные. Без них Globalize не сможет корректно отображать единицы измерения.
Минимальный набор данных:
Также требуется загрузка соответствующих JSON-файлов для выбранной локали.
Пример инициализации:
import Globalize from "globalize";
import likelySubtags from "cldr-core/supplemental/likelySubtags.json";
import unitData from "cldr-units-full/main/ru/units.json";
import numbers from "cldr-numbers-full/main/ru/numbers.json";
import plurals from "cldr-core/supplemental/plurals.json";
Globalize.load(likelySubtags, unitData, numbers, plurals);
Globalize.locale("ru");
Ключевой момент: без загрузки cldr-units-full форматирование единиц массы невозможно.
Globalize предоставляет специализированный механизм форматирования
единиц измерения — unitFormatter.
Базовый пример работы с килограммами:
const formatMass = Globalize.unitFormatter({
unit: "kilogram",
style: "long"
});
formatMass(5);
// "5 килограммов"
В этом примере:
unit определяет физическую величинуstyle: "long" задаёт полное текстовое
представлениеПомимо полного текстового представления, поддерживаются альтернативные стили форматирования:
const formatMassShort = Globalize.unitFormatter({
unit: "kilogram",
style: "short"
});
formatMassShort(5);
// "5 кг"
И компактный формат:
const formatMassNarrow = Globalize.unitFormatter({
unit: "kilogram",
style: "narrow"
});
formatMassNarrow(5);
// "5kg"
Разница между стилями определяется CLDR-локализацией и может существенно варьироваться в зависимости от языка.
Globalize поддерживает различные уровни детализации единиц массы:
const formatGrams = Globalize.unitFormatter({
unit: "gram",
style: "long"
});
formatGrams(250);
// "250 граммов"
В некоторых локалях граммы могут автоматически переключаться на килограммы при больших значениях, но это зависит от CLDR-правил, а не от логики Globalize.
Для систем, использующих имперские единицы, применяются другие идентификаторы:
const formatPounds = Globalize.unitFormatter({
unit: "pound",
style: "long"
});
formatPounds(10);
// "10 фунтов"
const formatOunces = Globalize.unitFormatter({
unit: "ounce",
style: "long"
});
formatOunces(12);
// "12 унций"
Особенность заключается в том, что правила множественного числа полностью определяются CLDR, включая формы для языков с развитой морфологией.
Globalize не использует универсальные правила формирования слов. Вместо этого применяется система plural rules из CLDR.
Например, в русском языке:
Эти формы не вычисляются вручную — они берутся из данных:
const formatKg = Globalize.unitFormatter({
unit: "kilogram",
style: "long"
});
formatKg(1);
formatKg(2);
formatKg(5);
Результаты зависят исключительно от локали ru.
Globalize поддерживает составные единицы, позволяя выражать массу в комбинированном виде:
const formatCompound = Globalize.unitFormatter({
unit: "kilogram",
style: "long",
form: "compound"
});
formatCompound(1.5);
// возможный результат: "1 килограмм и 500 граммов"
Поддержка составных единиц зависит от данных CLDR и не гарантирована для всех локалей.
Globalize не занимается нормализацией массы. Значения передаются в библиотеку в уже приведённом виде.
Пример неправильного ожидания:
Корректный подход:
const kg = 2.5;
const grams = kg * 1000;
const formatGrams = Globalize.unitFormatter({
unit: "gram",
style: "long"
});
formatGrams(grams);
Один и тот же код может давать разные результаты:
Это объясняется тем, что CLDR хранит:
Создание форматтера — операция затратная, так как происходит сборка правил из CLDR.
Оптимальная практика:
const formatKg = Globalize.unitFormatter({
unit: "kilogram",
style: "long"
});
// многократное использование
formatKg(1);
formatKg(10);
formatKg(100);
Некорректная инициализация CLDR:
// ошибка: отсутствуют cldr-units
Globalize.load(numbers);
Использование несуществующих единиц:
unit: "kg" // неверно
unit: "kilogram" // корректно
Попытка автоматического пересчёта:
Форматирование массы через Globalize применяется в системах, где важна локализация отображения:
Во всех случаях ключевым является разделение: