Работа с целыми числами в пользовательских формах требует строгого
контроля ввода: разделение разрядов, запрет лишних символов,
нормализация значения и предсказуемое отображение. В Cleave.js эта
задача решается через режим numeral, который предназначен
для числового форматирования и поддерживает работу как с целыми, так и с
дробными числами, при этом позволяя жёстко ограничивать поведение
ввода.
Основной принцип заключается в том, что библиотека не просто «маскирует» ввод, а преобразует его в числовое представление с форматированием на лету.
Для форматирования целых чисел используется опция:
numeral: trueПосле активации этого режима Cleave.js начинает интерпретировать ввод как число, автоматически удаляя недопустимые символы (буквы, пробелы, лишние знаки).
const cleave = new Cleave(inputElement, {
numeral: true
});
В этом состоянии ввод уже становится числовым, но без дополнительной настройки пользователь сможет вводить дробную часть и нестандартизированные форматы.
Чтобы жёстко ограничить ввод только целыми значениями, используется параметр:
numeralDecimalScale: 0Этот параметр определяет количество знаков после запятой. Ноль означает полный запрет дробной части.
const cleave = new Cleave(inputElement, {
numeral: true,
numeralDecimalScale: 0
});
Теперь любые попытки ввода разделителя дробной части игнорируются или обрезаются.
Одна из ключевых задач — визуальное разделение тысяч. Cleave.js поддерживает несколько стратегий группировки:
thousand — стандартная группировка по 3 цифрыlakh — индийская системаwan — китайская системаДля типичного случая используется:
const cleave = new Cleave(inputElement, {
numeral: true,
numeralDecimalScale: 0,
numeralThousandsGroupStyle: 'thousand'
});
При вводе числа 1000000 оно автоматически отображается
как 1,000,000.
По умолчанию библиотека использует запятую как разделитель. Это поведение можно изменить через:
delimiterconst cleave = new Cleave(inputElement, {
numeral: true,
numeralDecimalScale: 0,
numeralThousandsGroupStyle: 'thousand',
delimiter: ' '
});
Теперь число будет отображаться как 1 000 000.
Это особенно важно для локализации интерфейсов, где используются пробелы или точки вместо запятой.
Cleave.js поддерживает отрицательные значения без дополнительных
настроек. Символ - можно вводить в начале числа, и
библиотека корректно сохранит его позицию.
Однако при необходимости можно контролировать допустимость отрицательных значений через пользовательскую логику:
const cleave = new Cleave(inputElement, {
numeral: true,
numeralDecimalScale: 0,
numeralThousandsGroupStyle: 'thousand'
});
inputElement.addEventListener('input', () => {
if (inputElement.value.startsWith('--')) {
inputElement.value = inputElement.value.replace('--', '-');
}
});
Для контроля длины целого числа используется:
numeralIntegerScaleЭтот параметр задаёт максимальное количество цифр до разделителей.
const cleave = new Cleave(inputElement, {
numeral: true,
numeralDecimalScale: 0,
numeralIntegerScale: 6
});
В данном случае пользователь не сможет ввести число больше шести
цифр, например 999999.
Cleave.js разделяет:
Для получения «чистого» числа используется метод:
cleave.getRawValue();
Пример:
inputElement.addEventListener('change', () => {
console.log(cleave.getRawValue());
});
Если в поле отображается 1,000,000, метод вернёт
1000000.
При числовом формате ведущие нули обычно нежелательны. Cleave.js автоматически нормализует такие случаи:
000123 → отображается как 123Если требуется сохранить фиксированное количество разрядов (например,
коды или ID), Cleave.js не подходит напрямую, так как его
numeral режим ориентирован на математические значения, а не
идентификаторы.
При необходимости более строгого контроля можно комбинировать Cleave.js с дополнительной логикой:
const cleave = new Cleave(inputElement, {
numeral: true,
numeralDecimalScale: 0,
numeralIntegerScale: 8,
numeralThousandsGroupStyle: 'thousand'
});
inputElement.addEventListener('input', () => {
let value = cleave.getRawValue();
if (Number(value) > 10000000) {
inputElement.value = '10,000,000';
}
});
Такой подход позволяет использовать Cleave.js только как слой форматирования, а бизнес-ограничения реализовать отдельно.
В разных странах приняты разные правила группировки и разделителей:
1,000,0001 000 00010,00,000Cleave.js позволяет переключать стиль группировки, но не выполняет полноценную локализацию автоматически, поэтому часто требуется ручная настройка комбинации:
numeralThousandsGroupStyledelimiterПример адаптации под европейский стиль:
const cleave = new Cleave(inputElement, {
numeral: true,
numeralDecimalScale: 0,
numeralThousandsGroupStyle: 'thousand',
delimiter: ' '
});
При вставке чисел из буфера обмена Cleave.js автоматически:
Это важно для случаев, когда пользователь вставляет значения из Excel или бухгалтерских систем.
Режим numeral несовместим с масками фиксированных блоков
(blocks), так как он динамически перестраивает строку. При
проектировании интерфейсов следует разделять:
numeralblocksПри удалении всех символов поле остаётся пустым, а Cleave.js не подставляет нули автоматически. Это важно для корректной валидации формы:
if (cleave.getRawValue() === '') {
// поле не заполнено
}
Типовой набор настроек для строгого форматирования целых чисел:
const cleave = new Cleave(inputElement, {
numeral: true,
numeralDecimalScale: 0,
numeralIntegerScale: 10,
numeralThousandsGroupStyle: 'thousand',
delimiter: ','
});
Такая конфигурация обеспечивает: