Парсинг процентов

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


Локализация процентных форматов

Проценты в разных языках могут записываться по-разному:

  • 12% — стандартный формат в большинстве локалей
  • 12 % — вариант с пробелом (например, французская типографика)
  • 12,5% — использование запятой как десятичного разделителя
  • -12% — отрицательные значения
  • 12.5 % — формат с точкой и пробелом

Globalize не предполагает единственного универсального правила. Вместо этого используется локаль, которая определяет:

  • символ десятичного разделителя
  • допустимые пробелы
  • положение символа %
  • правила группировки чисел

Подготовка окружения

Перед парсингом процентов необходимо загрузить CLDR-данные и инициализировать локаль:

Globalize.load(
  require("cldr-data").entireSupplemental(),
  require("cldr-data").entireMainFor("ru")
);

const globalize = new Globalize("ru");

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


Базовый парсинг процентов

Для преобразования строкового значения процента в число используется parseNumber.

globalize.parseNumber("12%");

Результат:

12

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


Интерпретация процентного значения

Важно понимать, что результат парсинга — это число, а не доля.

globalize.parseNumber("50%");

Результат:

50

Это означает, что значение не преобразуется автоматически в 0.5. Такая модель выбрана намеренно: библиотека разделяет этапы:

  • парсинг строки → получение числа
  • интерпретация процента → прикладная логика приложения

Работа с локализованными форматами

Запятая как десятичный разделитель

globalize.parseNumber("12,5%");

Результат:

12.5

Globalize автоматически использует правила локали для корректного распознавания дробной части.


Пробелы и нестандартное форматирование

globalize.parseNumber(" 12 % ");

Результат:

12

Система игнорирует незначащие пробелы и корректно извлекает числовую часть.


Отрицательные проценты

Отрицательные значения поддерживаются на уровне стандартного парсинга чисел:

globalize.parseNumber("-15%");

Результат:

-15

В некоторых локалях отрицательный знак может отображаться иначе (например, скобками), но CLDR обеспечивает корректное распознавание таких форм.


Различие между parseNumber и форматированием процентов

Globalize не связывает напрямую парсинг и форматирование процентов. Форматирование выполняется отдельно:

globalize.formatNumber(0.25, { style: "percent" });

Результат:

25%

При этом обратная операция:

globalize.parseNumber("25%");

вернет:

25

Таким образом, преобразование в долю (0.25) должно выполняться вручную:

globalize.parseNumber("25%") / 100;

Локализационные особенности CLDR

CLDR-данные определяют поведение процентного формата через набор правил:

  • percentSign: символ процента для локали
  • numberSymbols: набор символов чисел
  • numberPatterns: шаблоны отображения
  • minimumFractionDigits и maximumFractionDigits

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


Влияние группировки разрядов

При наличии группировки:

globalize.parseNumber("1,200%");

Результат:

1200

В русской локали аналогично:

globalize.parseNumber("1 200%");

Результат:

1200

Группировочные символы удаляются согласно правилам локали.


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

При невозможности распознать число результатом становится null:

globalize.parseNumber("abc%");

Результат:

null

Также возвращается null, если строка содержит неоднозначный формат:

globalize.parseNumber("%12");

Поведение при смешанных строках

Если строка содержит дополнительные символы:

globalize.parseNumber("value 20%");

Результат:

20

Парсер извлекает первое корректное числовое значение, игнорируя текстовый контекст.


Использование процентного парсинга в бизнес-логике

В прикладных сценариях процентные значения часто участвуют в:

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

Типичный сценарий:

const input = "18,5%";
const value = globalize.parseNumber(input) / 100;

const price = 200;
const discounted = price - price * value;

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

Модель парсинга процентов в Globalize имеет ряд особенностей:

  • не выполняет автоматическое преобразование в долю
  • не интерпретирует % как математическую операцию
  • не учитывает контекст выражения (например, формулы)
  • требует корректной локали для точного разбора

Согласованность с форматированием чисел

Процентный парсинг полностью основан на общей системе parseNumber, поэтому:

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

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