Названия единиц измерения

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

В рамках Intl API работа с единицами измерения реализуется через два основных механизма:

  • Intl.DisplayNames с типом "unit"
  • Intl.NumberFormat с опцией style: "unit"

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


Международные идентификаторы единиц

Единицы измерения в Intl API задаются строковыми идентификаторами, соответствующими CLDR Unit Identifiers. Эти идентификаторы не являются произвольными и должны соответствовать спецификации.

Примеры базовых единиц:

  • "meter"
  • "kilometer"
  • "gram"
  • "kilogram"
  • "liter"
  • "second"
  • "minute"
  • "hour"
  • "celsius"
  • "fahrenheit"
  • "mile"
  • "yard"

Составные единицы формируются через дефис:

  • "kilometer-per-hour"
  • "mile-per-hour"
  • "meter-per-second"
  • "kilowatt-hour"
  • "liter-per-100-kilometer"

Такая система позволяет описывать как простые, так и производные физические величины.


Intl.DisplayNames и единицы измерения

Intl.DisplayNames предназначен для получения локализованных текстовых названий единиц без форматирования чисел. Он возвращает строковое представление единицы в выбранной локали.

Создание экземпляра

const units = new Intl.DisplayNames('ru', { type: 'unit' });

Получение названия единицы

units.of('meter'); 
// "метр"

units.of('kilometer');
// "километр"

units.of('mile-per-hour');
// "мили в час"

Локализация

Один и тот же идентификатор возвращает разные строки в зависимости от языка:

new Intl.DisplayNames('en', { type: 'unit' }).of('kilogram');
// "kilogram"

new Intl.DisplayNames('ru', { type: 'unit' }).of('kilogram');
// "килограмм"

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


Ограничения DisplayNames для единиц

Intl.DisplayNames предоставляет только название единицы, но не работает с числом. Он не учитывает:

  • множественное число
  • контекст величины (1 кг vs 2 кг)
  • форматирование числовых значений
  • сокращения или локальные символы

Поэтому он используется преимущественно для интерфейсов, где требуется справочное отображение единицы, а не форматирование измерений.


Intl.NumberFormat и единицы измерения

Для полноценного форматирования числовых значений с единицами используется Intl.NumberFormat.

Базовая конфигурация

const formatter = new Intl.NumberFormat('ru', {
  style: 'unit',
  unit: 'kilometer'
});

formatter.format(5);
// "5 км"

В отличие от DisplayNames, здесь происходит полное форматирование числа вместе с единицей.


Параметр unit

Опция unit определяет конкретную единицу измерения. Поддерживаются:

Длина

  • "meter"
  • "kilometer"
  • "centimeter"
  • "mile"

Масса

  • "gram"
  • "kilogram"
  • "ounce"
  • "pound"

Объём

  • "liter"
  • "milliliter"
  • "gallon"

Время

  • "second"
  • "minute"
  • "hour"
  • "day"

Скорость и производные

  • "mile-per-hour"
  • "kilometer-per-hour"

Форматы отображения unitDisplay

Опция unitDisplay управляет степенью сокращения единицы:

"long"

Полное текстовое представление:

new Intl.NumberFormat('en', {
  style: 'unit',
  unit: 'kilometer',
  unitDisplay: 'long'
}).format(3);
// "3 kilometers"

"short"

Сокращённый вариант:

// "3 km"

"narrow"

Максимально компактный формат:

// "3km"

Разница между short и narrow особенно заметна в языках с длинными локализованными обозначениями.


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

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

Русский язык

const f = new Intl.NumberFormat('ru', {
  style: 'unit',
  unit: 'kilometer'
});

f.format(1);  // "1 километр"
f.format(2);  // "2 километра"
f.format(5);  // "5 километров"

Морфологические формы выбираются автоматически на основе правил plural rules CLDR.


Составные единицы

Intl поддерживает сложные единицы, описывающие отношения величин.

Скорость

new Intl.NumberFormat('en', {
  style: 'unit',
  unit: 'mile-per-hour'
}).format(60);
// "60 mph"

Расход топлива

new Intl.NumberFormat('en', {
  style: 'unit',
  unit: 'liter-per-100-kilometer'
}).format(7.5);
// "7.5 L/100km"

Составные единицы особенно полезны в автомобильных, научных и инженерных интерфейсах.


Отличия Intl.DisplayNames и Intl.NumberFormat для единиц

Intl.DisplayNames

  • возвращает только название единицы
  • не работает с числами
  • подходит для справочников и UI-меток
  • быстрее и легче по вычислениям

Intl.NumberFormat

  • форматирует число и единицу одновременно
  • учитывает множественные формы
  • поддерживает сокращения и локальные стандарты
  • используется для отображения измерений в интерфейсе

Особенности локальных обозначений

В разных локалях единицы могут иметь различные формы:

  • сокращения (km, км)
  • порядок слов
  • наличие пробелов
  • символические формы (°C, mph)

Например:

new Intl.NumberFormat('en-US', {
  style: 'unit',
  unit: 'celsius'
}).format(25);
// "25°C"

new Intl.NumberFormat('ru', {
  style: 'unit',
  unit: 'celsius'
}).format(25);
// "25 °C"

Различие может быть как в пробелах, так и в использовании символов.


Нормализация значений единиц

Unit identifiers чувствительны к точному написанию. Следует учитывать:

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

Некорректные значения приводят к ошибкам или игнорированию параметров.


Производительность и повторное использование

Создание экземпляра Intl.NumberFormat или Intl.DisplayNames является затратной операцией. В высоконагруженных сценариях экземпляры обычно кешируются:

  • один форматтер на локаль и тип единицы
  • повторное использование вместо пересоздания
  • минимизация изменений конфигурации

Ограничения реализации

Несмотря на широкую поддержку, существуют ограничения:

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

Практические сценарии применения

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

Поведение при изменении локали

При смене языка все единицы автоматически пересчитываются:

  • меняются сокращения
  • изменяется грамматика
  • перестраивается порядок элементов
  • обновляются символы и разделители

Это позволяет строить интерфейсы без ручного управления локализацией единиц.