Cleave.js предоставляет механизм форматирования ввода данных на основе предустановленных правил, которые могут адаптироваться под региональные особенности: числовые разряды, десятичные разделители, телефонные коды, шаблоны дат и валютные представления. Архитектура библиотеки построена так, чтобы форматирование применялось декларативно через конфигурацию, что позволяет создавать наборы «локалей» поверх базовых опций.
Одним из ключевых аспектов локализации является представление чисел. В разных регионах различается как разделитель дробной части, так и группировка разрядов.
В Cleave.js управление числовым форматом осуществляется через набор параметров:
numeralnumeralThousandsGroupStylenumeralDecimalMarkdelimiterВ европейских локалях часто используется запятая как десятичный разделитель, тогда как в англоязычных регионах применяется точка. Это поведение задаётся через:
new Cleave(input, {
numeral: true,
numeralDecimalMark: ',',
delimiter: ' '
});
В данном случае дробная часть отделяется запятой, а тысячные группы — пробелом.
Для США характерна обратная конфигурация:
new Cleave(input, {
numeral: true,
numeralDecimalMark: '.',
delimiter: ','
});
Cleave.js поддерживает несколько стратегий группировки:
thousand — стандартная западная система
(1,000,000)lakh — индийская система (10,00,000)wan — восточноазиатская система (1,0000,0000)Пример индийского формата:
new Cleave(input, {
numeral: true,
numeralThousandsGroupStyle: 'lakh'
});
Такой подход позволяет адаптировать отображение чисел под экономические и культурные стандарты региона без изменения входных данных.
Хотя Cleave.js не является полноценной финансовой библиотекой, он
позволяет имитировать валютные поля через комбинацию
prefix, numeral и разделителей.
new Cleave(input, {
numeral: true,
prefix: '€ ',
numeralDecimalMark: ',',
delimiter: ' '
});
Для долларовой локали:
new Cleave(input, {
numeral: true,
prefix: '$ ',
numeralDecimalMark: '.',
delimiter: ','
});
Важной особенностью является то, что префикс фиксируется в начале строки и не участвует в вычислениях, но влияет на позиционирование курсора и парсинг ввода.
На практике часто создаются конфигурационные маппинги:
const currencyLocales = {
US: {
prefix: '$ ',
decimal: '.',
delimiter: ','
},
FR: {
prefix: '€ ',
decimal: ',',
delimiter: ' '
},
KZ: {
prefix: '₸ ',
decimal: ',',
delimiter: ' '
}
};
И применение:
const locale = currencyLocales['FR'];
new Cleave(input, {
numeral: true,
prefix: locale.prefix,
numeralDecimalMark: locale.decimal,
delimiter: locale.delimiter
});
Такой слой абстракции позволяет централизованно управлять региональными настройками.
Телефонный модуль Cleave.js ориентирован на региональные маски,
которые определяются через phoneRegionCode. Этот параметр
задаёт базовый шаблон, соответствующий стране.
new Cleave(input, {
phone: true,
phoneRegionCode: 'US'
});
Для Великобритании:
new Cleave(input, {
phone: true,
phoneRegionCode: 'GB'
});
Для Казахстана:
new Cleave(input, {
phone: true,
phoneRegionCode: 'KZ'
});
Телефонные форматы в Cleave.js опираются на внутренние маски, где определяются:
Телефонные шаблоны не являются динамическими на уровне валидации операторов связи. Они представляют собой только структурное форматирование. Это означает, что:
Cleave.js поддерживает форматирование дат через
date: true и шаблон datePattern. Региональные
различия здесь выражаются в порядке компонентов даты.
new Cleave(input, {
date: true,
datePattern: ['d', 'm', 'Y'],
delimiter: '.'
});
Результат: 31.12.2026
new Cleave(input, {
date: true,
datePattern: ['m', 'd', 'Y'],
delimiter: '/'
});
Результат: 12/31/2026
new Cleave(input, {
date: true,
datePattern: ['Y', 'm', 'd'],
delimiter: '-'
});
Результат: 2026-12-31
Региональные предустановки обычно включают не только порядок, но и разделитель, так как в разных странах используются разные стандарты визуального восприятия даты.
Так как библиотека не содержит встроенной системы i18n, региональные пресеты создаются вручную как слой конфигурации.
const localePreset = {
numeral: {
decimalMark: ',',
delimiter: ' ',
groupStyle: 'thousand'
},
currency: {
prefix: '€ ',
decimalMark: ',',
delimiter: ' '
},
date: {
pattern: ['d', 'm', 'Y'],
delimiter: '.'
},
phone: {
region: 'FR'
}
};
function createCleave(type, input, locale) {
if (type === 'currency') {
return new Cleave(input, {
numeral: true,
prefix: locale.currency.prefix,
numeralDecimalMark: locale.currency.decimalMark,
delimiter: locale.currency.delimiter
});
}
if (type === 'date') {
return new Cleave(input, {
date: true,
datePattern: locale.date.pattern,
delimiter: locale.date.delimiter
});
}
if (type === 'phone') {
return new Cleave(input, {
phone: true,
phoneRegionCode: locale.phone.region
});
}
if (type === 'numeral') {
return new Cleave(input, {
numeral: true,
numeralDecimalMark: locale.numeral.decimalMark,
numeralThousandsGroupStyle: locale.numeral.groupStyle,
delimiter: locale.numeral.delimiter
});
}
}
Такой подход позволяет централизованно переключать региональные форматы без изменения логики UI.
В интерфейсах с поддержкой смены языка или региона важно пересоздавать экземпляры Cleave.js при смене конфигурации.
let cleaveInstance;
function setLocale(type, input, locale) {
if (cleaveInstance) {
cleaveInstance.destroy();
}
cleaveInstance = createCleave(type, input, locale);
}
Деструкция экземпляра критична, поскольку Cleave.js привязывает обработчики событий напрямую к DOM-элементу. Без очистки возможно накопление слушателей и неконсистентное поведение форматирования.
В реальных системах редко используется чистая локаль. Обычно применяется гибрид:
Пример смешанной конфигурации:
const mixedLocale = {
numeral: 'EU',
currency: 'USD',
date: 'ISO',
phone: 'KZ'
};
Такая модель отражает реальную практику международных интерфейсов, где данные принадлежат разным доменам локализации.
Региональные предустановки в Cleave.js требуют учёта нескольких технических нюансов:
Особенно важно учитывать, что Cleave.js работает на уровне представления данных. Это означает, что форматирование не должно использоваться как единственный механизм валидации. Региональные пресеты отвечают только за визуальную и интерактивную структуру ввода, не за семантическую корректность значения.