В работе с интернационализацией числовых данных одной из ключевых задач становится корректное отображение производных единиц измерения, таких как площадь и объём. В контексте Globalize эти величины не вычисляются библиотекой, а форматируются на основе стандартов CLDR (Unicode Common Locale Data Repository), что обеспечивает единообразие представления в разных локалях.
Площадь и объём в Globalize рассматриваются как производные единицы:
Однако библиотека не оперирует математическими операциями над величинами. Вместо этого используются заранее определённые единицы:
square-meter, square-kilometer,
square-footcubic-meter, cubic-centimeter,
cubic-footКаждая единица хранится в CLDR как самостоятельный идентификатор с локализованными правилами отображения.
Перед использованием форматирования единиц необходимо загрузить CLDR-данные и инициализировать Globalize.
import Globalize from "globalize";
// загрузка CLDR данных
Globalize.load(
require("cldr-data").entireSupplemental(),
require("cldr-data").entireMainFor("ru")
);
// установка локали
const globalize = Globalize("ru");
Без корректно загруженных данных форматирование единиц будет недоступно, так как Globalize полностью зависит от CLDR.
Для отображения площади используется unitFormatter с
указанием соответствующей единицы измерения.
const formatSquareMeters = globalize.unitFormatter("square-meter");
formatSquareMeters(12);
// "12 квадратных метров"
Локализация учитывает:
Globalize поддерживает разные стили представления:
const longFormatter = globalize.unitFormatter("square-meter", {
form: "long"
});
const shortFormatter = globalize.unitFormatter("square-meter", {
form: "short"
});
Результаты:
12 квадратных метров12 м²Формат short особенно важен для интерфейсов с
ограниченным пространством, таких как таблицы или мобильные
приложения.
Объём обрабатывается аналогичным образом, но с использованием кубических единиц.
const formatCubicMeters = globalize.unitFormatter("cubic-meter");
formatCubicMeters(3);
// "3 кубических метра"
В разных языках структура фраз может существенно отличаться. Например:
Globalize учитывает эти различия через CLDR-данные, не требуя ручной настройки правил.
Globalize разделяет ответственность:
numberFormatterunitFormatterconst numberFormatter = globalize.numberFormatter();
const volumeFormatter = globalize.unitFormatter("cubic-meter");
const value = 1234.56;
volumeFormatter(numberFormatter(value));
// "1 234,56 кубических метра"
Это разделение позволяет точно контролировать формат чисел независимо от единиц измерения.
Для работы с большими или малыми значениями используется стандартное форматирование чисел, а единицы остаются неизменными.
const areaFormatter = globalize.unitFormatter("square-kilometer");
areaFormatter(5);
// "5 квадратных километров"
При этом CLDR не выполняет автоматического перевода между единицами. Преобразование километров в метры или гектары должно выполняться до передачи значения в Globalize.
CLDR содержит правила plural rules, которые определяют форму единицы в зависимости от числа.
Пример для русского языка:
Globalize применяет эти правила автоматически:
const formatter = globalize.unitFormatter("square-meter");
formatter(1); // "1 квадратный метр"
formatter(2); // "2 квадратных метра"
formatter(5); // "5 квадратных метров"
Эта логика полностью определяется данными локали и не требует дополнительного кода.
Площадь и объём часто требуют контроля точности отображения. Это достигается через предварительное форматирование числа:
const numberFormatter = globalize.numberFormatter({
minimumFractionDigits: 2,
maximumFractionDigits: 2
});
const areaFormatter = globalize.unitFormatter("square-meter");
areaFormatter(numberFormatter(10.5));
// "10,50 квадратных метров"
Такой подход обеспечивает единообразное представление данных в интерфейсах с фиксированной точностью.
При отображении таблиц или карточек объектов площадь и объём часто комбинируются с другими единицами:
const area = globalize.unitFormatter("square-meter");
const volume = globalize.unitFormatter("cubic-meter");
const data = {
floorArea: area(85),
buildingVolume: volume(240)
};
Результат:
85 квадратных метров240 кубических метровМеханизм работы с площадью и объёмом имеет ряд принципиальных ограничений:
Globalize выполняет исключительно задачу представления данных, не вмешиваясь в вычисления.
Изменение локали полностью меняет отображение единиц:
const en = Globalize("en");
const formatter = en.unitFormatter("square-meter");
formatter(12);
// "12 square meters"
Та же структура данных, но иная грамматическая модель и порядок слов.
Площадь и объём в Globalize реализуются через единый механизм форматирования единиц измерения, где ключевую роль играет CLDR. Это позволяет поддерживать строгую консистентность отображения данных при полной независимости от бизнес-логики приложения.