Площадь и объем

В работе с интернационализацией числовых данных одной из ключевых задач становится корректное отображение производных единиц измерения, таких как площадь и объём. В контексте Globalize эти величины не вычисляются библиотекой, а форматируются на основе стандартов CLDR (Unicode Common Locale Data Repository), что обеспечивает единообразие представления в разных локалях.

Модель представления составных единиц

Площадь и объём в Globalize рассматриваются как производные единицы:

  • площадь — результат возведения длины в квадрат
  • объём — результат возведения длины в куб

Однако библиотека не оперирует математическими операциями над величинами. Вместо этого используются заранее определённые единицы:

  • square-meter, square-kilometer, square-foot
  • cubic-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"
});

Результаты:

  • long: 12 квадратных метров
  • short: 12 м²

Формат short особенно важен для интерфейсов с ограниченным пространством, таких как таблицы или мобильные приложения.

Форматирование объёма

Объём обрабатывается аналогичным образом, но с использованием кубических единиц.

const formatCubicMeters = globalize.unitFormatter("cubic-meter");

formatCubicMeters(3);
// "3 кубических метра"

Различие в локализациях

В разных языках структура фраз может существенно отличаться. Например:

  • в русском языке: «3 кубических метра»
  • в английском: «3 cubic meters»

Globalize учитывает эти различия через CLDR-данные, не требуя ручной настройки правил.

Комбинирование чисел и единиц

Globalize разделяет ответственность:

  • числовое форматирование выполняет numberFormatter
  • единицы измерения обрабатывает unitFormatter
const 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, которые определяют форму единицы в зависимости от числа.

Пример для русского языка:

  • 1 квадратный метр
  • 2 квадратных метра
  • 5 квадратных метров

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)
};

Результат:

  • floorArea: 85 квадратных метров
  • buildingVolume: 240 кубических метров

Ограничения модели Globalize

Механизм работы с площадью и объёмом имеет ряд принципиальных ограничений:

  • отсутствует физическое преобразование единиц
  • нет поддержки пользовательских единиц измерения без расширения CLDR
  • значения всегда форматируются как уже вычисленные данные

Globalize выполняет исключительно задачу представления данных, не вмешиваясь в вычисления.

Поведение в разных локалях

Изменение локали полностью меняет отображение единиц:

const en = Globalize("en");

const formatter = en.unitFormatter("square-meter");

formatter(12);
// "12 square meters"

Та же структура данных, но иная грамматическая модель и порядок слов.


Площадь и объём в Globalize реализуются через единый механизм форматирования единиц измерения, где ключевую роль играет CLDR. Это позволяет поддерживать строгую консистентность отображения данных при полной независимости от бизнес-логики приложения.