Работа с процентными значениями в интернационализированных приложениях требует учета локальных соглашений о форматировании чисел, различий в разделителях, порядке символов и правилах отображения знака процента. В 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 обеспечивает корректное распознавание таких форм.
Globalize не связывает напрямую парсинг и форматирование процентов. Форматирование выполняется отдельно:
globalize.formatNumber(0.25, { style: "percent" });
Результат:
25%
При этом обратная операция:
globalize.parseNumber("25%");
вернет:
25
Таким образом, преобразование в долю (0.25) должно выполняться вручную:
globalize.parseNumber("25%") / 100;
CLDR-данные определяют поведение процентного формата через набор правил:
percentSign: символ процента для локалиnumberSymbols: набор символов чиселnumberPatterns: шаблоны отображенияminimumFractionDigits и
maximumFractionDigitsGlobalize использует эти данные для обеспечения консистентного поведения в разных языках.
При наличии группировки:
globalize.parseNumber("1,200%");
Результат:
1200
В русской локали аналогично:
globalize.parseNumber("1 200%");
Результат:
1200
Группировочные символы удаляются согласно правилам локали.
При невозможности распознать число результатом становится
null:
globalize.parseNumber("abc%");
Результат:
null
Также возвращается null, если строка содержит
неоднозначный формат:
globalize.parseNumber("%12");
Если строка содержит дополнительные символы:
globalize.parseNumber("value 20%");
Результат:
20
Парсер извлекает первое корректное числовое значение, игнорируя текстовый контекст.
В прикладных сценариях процентные значения часто участвуют в:
Типичный сценарий:
const input = "18,5%";
const value = globalize.parseNumber(input) / 100;
const price = 200;
const discounted = price - price * value;
Модель парсинга процентов в Globalize имеет ряд особенностей:
% как математическую операциюПроцентный парсинг полностью основан на общей системе
parseNumber, поэтому:
Это обеспечивает предсказуемость поведения при переходе между форматами данных.