Модуль форматирования чисел в Cleave.js поддерживает отображение дополнительных текстовых элементов рядом с числовыми значениями. Наиболее распространённый сценарий — добавление валютных обозначений, единиц измерения, процентов, кодов стран и пользовательских меток.
Для этой задачи используются параметры:
prefixnoImmediatePrefixrawValueTrimPrefixПрефикс отображается перед значением, а суффикс обычно реализуется
вручную, поскольку встроенного параметра suffix библиотека
не содержит.
Простейший пример — отображение символа валюты перед числом.
<input type="text" id="price">
new Cleave('#price', {
numeral: true,
numeralThousandsGroupStyle: 'thousand',
prefix: '$'
});
Результат:
$12,500
При вводе числа библиотека автоматически:
Для читаемости часто используется пробел после обозначения валюты.
new Cleave('#price', {
numeral: true,
prefix: '$ ',
numeralThousandsGroupStyle: 'thousand'
});
Результат:
$ 8,900
Аналогично:
prefix: '€ '
prefix: '₸ '
prefix: 'USD '
new Cleave('#price', {
numeral: true,
numeralThousandsGroupStyle: 'thousand',
prefix: '₸ '
});
Результат:
₸ 450,000
new Cleave('#price', {
numeral: true,
prefix: '₽ ',
numeralThousandsGroupStyle: 'thousand'
});
new Cleave('#usd', {
numeral: true,
prefix: '$ '
});
new Cleave('#eur', {
numeral: true,
prefix: '€ '
});
По умолчанию префикс появляется сразу после инициализации поля, даже если значение пустое.
Пример:
$
Для отключения такого поведения используется
noImmediatePrefix.
new Cleave('#price', {
numeral: true,
prefix: '$ ',
noImmediatePrefix: true
});
Теперь символ валюты появится только после начала ввода.
Без noImmediatePrefix поле после удаления числа может
выглядеть так:
$
С noImmediatePrefix: true поле полностью очищается.
Это особенно важно:
Поле отображает форматированное значение:
$ 15,000
Но во многих случаях серверу требуется:
15000
Для этого используется rawValue.
const cleave = new Cleave('#price', {
numeral: true,
prefix: '$ '
});
console.log(cleave.getRawValue());
Результат:
15000
Иногда библиотека может сохранять префикс внутри raw-значения. Для принудительного удаления применяется:
rawValueTrimPrefix: true
Пример:
new Cleave('#price', {
numeral: true,
prefix: '$ ',
rawValueTrimPrefix: true
});
Вместо символов нередко используются буквенные обозначения.
new Cleave('#price', {
numeral: true,
prefix: 'USD '
});
Результат:
USD 2,400
Другие варианты:
prefix: 'KZT '
prefix: 'EUR '
prefix: 'RUB '
prefix: 'GBP '
Префикс можно изменять во время работы приложения.
const cleave = new Cleave('#price', {
numeral: true,
prefix: '$ '
});
Позже:
cleave.properties.prefix = '€ ';
cleave.setRawValue('5000');
После обновления:
€ 5,000
Частый сценарий — переключение валюты пользователем.
<select id="currency">
<option value="$ ">$</option>
<option value="€ ">€</option>
<option value="₸ ">₸</option>
</select>
<input type="text" id="amount">
const cleave = new Cleave('#amount', {
numeral: true,
prefix: '$ '
});
document.querySelector('#currency')
.addEventListener('change', function () {
cleave.properties.prefix = this.value;
const value = cleave.getRawValue();
cleave.setRawValue(value);
});
Префикс подходит не только для валют.
new Cleave('#discount', {
numeral: true,
prefix: 'Discount '
});
Результат:
Discount 15
Встроенного свойства suffix библиотека не предоставляет,
поэтому суффикс реализуется вручную.
Простейший вариант:
input.addEventListener('input', function () {
this.value = this.value + ' kg';
});
Однако такой подход конфликтует с управлением курсором.
Более корректный вариант:
const cleave = new Cleave('#weight', {
numeral: true
});
const input = document.querySelector('#weight');
input.addEventListener('blur', () => {
input.value = cleave.getFormattedValue() + ' kg';
});
input.addEventListener('focus', () => {
input.value = cleave.getRawValue();
});
Во многих странах валюта отображается после суммы.
Пример:
15 000 ₸
Такой формат можно реализовать вручную.
const cleave = new Cleave('#price', {
numeral: true,
numeralThousandsGroupStyle: 'thousand'
});
const input = document.querySelector('#price');
input.addEventListener('blur', () => {
input.value = cleave.getFormattedValue() + ' ₸';
});
input.addEventListener('focus', () => {
input.value = cleave.getRawValue();
});
При ручной реализации возникают сложности:
Если суффикс находится внутри поля:
150 kg
курсор может попадать внутрь текста kg.
Backspace способен удалять часть суффикса:
150 k
При повторном blur:
150 kg kg
Поэтому требуется проверка существующего суффикса.
input.addEventListener('blur', () => {
let value = cleave.getFormattedValue();
if (!value.endsWith(' kg')) {
input.value = value + ' kg';
}
});
Один из лучших подходов — разделение:
<input type="text" id="visible-price">
<input type="hidden" id="real-price">
const cleave = new Cleave('#visible-price', {
numeral: true,
prefix: '$ '
});
document.querySelector('#visible-price')
.addEventListener('input', () => {
document.querySelector('#real-price').value =
cleave.getRawValue();
});
new Cleave('#salary', {
numeral: true,
numeralDecimalScale: 2,
prefix: '$ '
});
Результат:
$ 12,500.75
new Cleave('#eur', {
numeral: true,
numeralDecimalMark: ',',
delimiter: '.',
prefix: '€ '
});
Результат:
€ 1.500,75
Префиксы подходят для любых текстовых маркеров.
prefix: 'Сумма: '
prefix: 'Оплата: '
prefix: 'Цена: '
prefix: 'Balance: '
Пример:
new Cleave('#price', {
numeral: true,
prefix: 'Цена: '
});
В React префиксы работают аналогично.
<Cleave
options={{
numeral: true,
prefix: '$ ',
numeralThousandsGroupStyle: 'thousand'
}}
/>
Получение rawValue:
onCha nge={(e) => {
console.log(e.target.rawValue);
}}
<cleave
:options="{
numeral: true,
prefix: '₸ '
}"
/>
Префикс можно использовать совместно с блоками.
new Cleave('#card', {
prefix: 'CARD ',
blocks: [4, 4, 4, 4],
delimiter: '-'
});
Результат:
CARD 1234-5678-9012-3456
Нельзя выполнять математические операции напрямую над:
$ 500
Необходимо использовать:
getRawValue()
Пользователь копирует:
$ 15,000
а не:
15000
Регулярные выражения должны учитывать префикс.
Неправильно:
/^\d+$/
Правильно:
/^\$\s\d+(,\d+)*$/
или проверка rawValue.
<input type="text" id="salary">
const salary = new Cleave('#salary', {
numeral: true,
numeralThousandsGroupStyle: 'thousand',
numeralDecimalScale: 2,
prefix: '₸ ',
noImmediatePrefix: true,
rawValueTrimPrefix: true
});
Поведение: