В Cleave.js обработка чисел строится вокруг преобразования «сырого» ввода пользователя в визуально структурированное представление. Основная задача — разделить длинные последовательности цифр на читаемые группы без изменения фактического значения. Это особенно важно для финансовых полей, статистических данных и любых интерфейсов, где требуется быстрый визуальный разбор числа.
Ключевая особенность библиотеки заключается в том, что форматирование происходит по мере ввода, а не постфактум. Это исключает необходимость ручной обработки строк и снижает вероятность ошибок при отображении.
Для активации числового форматирования используется параметр:
numeral: trueОн переводит Cleave.js в режим, в котором входные данные интерпретируются как число, а не как произвольная строка. После этого библиотека начинает применять правила группировки разрядов и обработки десятичной части.
const cleave = new Cleave(input, {
numeral: true
});
В этом режиме любые символы, не являющиеся цифрами или допустимым десятичным разделителем, автоматически игнорируются.
Основной механизм настройки разделителей реализуется через параметр:
numeralThousandsGroupStyleОн определяет стратегию разбиения числа на группы разрядов.
1. thousand Классическая западная система группировки по три цифры справа налево.
Пример:
1234567 → 1,234,567
new Cleave(input, {
numeral: true,
numeralThousandsGroupStyle: 'thousand'
});
2. lakh Индийская система группировки, где первая группа состоит из трёх цифр, а последующие — по две.
Пример:
12345678 → 1,23,45,678
new Cleave(input, {
numeral: true,
numeralThousandsGroupStyle: 'lakh'
});
Эта модель часто используется в финансовых системах, ориентированных на индийский рынок.
3. wan Китайская система группировки, ориентированная на разбиение по 4 цифры.
Пример:
12345678 → 1,2345,678
new Cleave(input, {
numeral: true,
numeralThousandsGroupStyle: 'wan'
});
Такая схема используется в локализациях, где числовые разряды традиционно воспринимаются в группах по четыре цифры.
4. none Полное отключение группировки.
Пример:
1234567 → 1234567
new Cleave(input, {
numeral: true,
numeralThousandsGroupStyle: 'none'
});
Используется в случаях, где форматирование нежелательно, например при техническом вводе идентификаторов.
Помимо стратегии группировки, важную роль играет символ, используемый между группами. Он задаётся параметром:
delimiterПо умолчанию используется запятая, но его можно заменить на любой символ.
new Cleave(input, {
numeral: true,
numeralThousandsGroupStyle: 'thousand',
delimiter: ' '
});
В результате число будет отображаться так:
1234567 → 1 234 567
Часто применяются следующие варианты:
Важно учитывать совместимость с десятичным разделителем, чтобы не возникало визуальной неоднозначности.
Для чисел с плавающей точкой используется параметр:
numeralDecimalMarkОн определяет символ, отделяющий целую часть от дробной.
new Cleave(input, {
numeral: true,
numeralDecimalMark: '.',
delimiter: ','
});
Пример поведения:
12345.67 → 12,345.67
При изменении локали часто требуется синхронная настройка:
Чтобы избежать конфликтов между ними.
Хотя Cleave.js не предназначен для математической обработки чисел, он позволяет косвенно контролировать формат вводимого значения через комбинацию настроек и внешней логики.
Типичный подход — ограничение длины дробной части через обработку события ввода и переустановку значения через API экземпляра.
cleave.setRawValue('12345.6789');
Это позволяет синхронизировать внешний источник данных с визуальным представлением.
Одним из ключевых аспектов является различие между отображаемым и фактическим значением.
Для получения необработанного числа используется метод:
getRawValue()Он возвращает строку без разделителей.
const raw = cleave.getRawValue();
// "1234567"
Это значение используется для:
Отображаемая версия при этом может содержать любые символы форматирования.
Cleave.js позволяет изменять настройки после инициализации. Это важно для интерфейсов, где формат зависит от выбора пользователя или локали.
cleave.properties.numeralThousandsGroupStyle = 'lakh';
cleave.init();
При этом происходит повторная инициализация внутреннего парсера, и новое правило применяется ко всему текущему значению.
Часто числовое поле используется совместно с валютными символами. В Cleave.js это реализуется через параметры:
prefixnumeralnew Cleave(input, {
numeral: true,
numeralThousandsGroupStyle: 'thousand',
prefix: '$'
});
Результат:
$1234567 → $1,234,567
При этом префикс не участвует в расчёте значения и рассматривается как декоративный элемент.
При работе с группировкой цифр важно учитывать поведение при редактировании в середине строки. Cleave.js пересчитывает форматирование после каждого изменения, что может приводить к:
Эти эффекты являются следствием синхронного форматирования и не требуют дополнительной обработки в большинстве случаев.
При вставке длинных числовых последовательностей библиотека применяет форматирование целиком к вставленному значению. Это означает, что даже если пользователь вставляет строку без разделителей, она мгновенно преобразуется в соответствующую структуру группировки.
Пример:
ввод: 1000000000
вывод: 1,000,000,000
При этом стратегия группировки определяется текущей конфигурацией и применяется без промежуточных состояний.
Группировка цифр редко используется изолированно. В реальных интерфейсах она комбинируется с локализацией формата чисел.
Типичный набор:
numeral: truenumeralThousandsGroupStyledelimiternumeralDecimalMarkПример конфигурации для европейского формата:
new Cleave(input, {
numeral: true,
numeralThousandsGroupStyle: 'thousand',
delimiter: ' ',
numeralDecimalMark: ','
});
Результат:
1234567.89 → 1 234 567,89
При вводе символов, не относящихся к числовому формату, Cleave.js выполняет фильтрацию. Однако поведение зависит от режима:
numeral: true всё, кроме цифр и десятичного маркера,
игнорируетсяЭто делает числовой режим более строгим и предсказуемым для финансовых данных.
Каждое изменение значения проходит через три этапа:
После этого формируется итоговая строка отображения, которая синхронизируется с DOM-элементом.
Такой подход обеспечивает стабильность результата вне зависимости от скорости ввода или источника изменения значения.