Цифровые единицы

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

Архитектура поддержки цифровых единиц

Механизм цифровых единиц встроен в подсистему unit formatting. В CLDR они определяются в категории digital, включающей базовую единицу byte и её производные:

  • byte
  • kilobyte
  • megabyte
  • gigabyte
  • terabyte
  • petabyte
  • exabyte

Каждая единица содержит локализованные формы отображения:

  • long (полная форма)
  • short (сокращённая форма)
  • narrow (минималистичная форма)

Globalize использует эти данные для построения строк форматирования с учётом языка и правил грамматики.

Подготовка данных CLDR для цифровых единиц

Перед использованием форматирования необходимо загрузить соответствующие части 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 мегабайт"

Форматы отображения: long, short, narrow

CLDR поддерживает три основных стиля отображения цифровых единиц.

Long формат

Полное написание единицы:

const formatLong = Globalize.unitFormatter({
  unit: "gigabyte",
  style: "long"
});

formatLong(2); // "2 гигабайта"

Short формат

Сокращённое представление:

const formatShort = Globalize.unitFormatter({
  unit: "gigabyte",
  style: "short"
});

formatShort(2); // "2 ГБ"

Narrow формат

Минимально возможная форма:

const formatNarrow = Globalize.unitFormatter({
  unit: "gigabyte",
  style: "narrow"
});

formatNarrow(2); // "2ГБ"

Разница между стилями определяется локальными правилами и может варьироваться в зависимости от языка.

Локализация и правила множественного числа

Цифровые единицы тесно связаны с системой plural rules. В русском языке различаются формы:

  • 1 байт
  • 2 байта
  • 5 байтов

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 мегабайта" (в русской локали)

Параметры форматирования:

  • minimumFractionDigits
  • maximumFractionDigits
  • roundingMode

Комбинация с другими форматами

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

const numberFormatter = Globalize.numberFormatter();
const unitFormatter = Globalize.unitFormatter("gigabyte");

const value = numberFormatter(3.14) + " " + unitFormatter(3.14);

Хотя подобное комбинирование редко требуется, оно демонстрирует совместимость подсистем библиотеки.

Особенности реализации в разных локалях

Разные языки могут по-разному трактовать цифровые единицы:

  • различная система сокращений (GB vs ГБ)
  • различный порядок слов
  • разные правила пробелов между числом и единицей
  • различия в plural rules

Globalize полностью опирается на CLDR, что исключает необходимость ручной настройки для каждой локали.

Практические ограничения модели цифровых единиц

Система цифровых единиц в Globalize ориентирована на представление, а не на вычисления. Она не занимается:

  • конвертацией между двоичными и десятичными префиксами (IEC vs SI)
  • автоматическим выбором оптимальной единицы без внешней логики
  • хранением состояния значений

Все подобные задачи реализуются на уровне прикладного кода, а Globalize выполняет исключительно задачу локализованного отображения.

Структура данных CLDR для цифровых единиц

CLDR хранит описание единиц в виде структурированных записей:

  • unit
  • displayName
  • patterns для plural categories
  • style variants

Globalize интерпретирует эти данные и формирует форматтеры на их основе. Это обеспечивает единообразие поведения во всех поддерживаемых языках без ручной настройки шаблонов.