Международные форматы номеров

Работа с международными телефонными форматами в Cleave.js строится вокруг идеи адаптивной маски ввода, которая подстраивается под региональные правила набора номера, структуру длины и форматирование, характерное для конкретных стран. В отличие от статических масок, где структура фиксирована (например, (999) 999-9999), международные номера требуют гибкости: различная длина национальных номеров, наличие или отсутствие кода страны, разные правила группировки цифр и вариативные префиксы.

В Cleave.js телефонная логика основана на нескольких ключевых режимах:

  • phone — активирует телефонное форматирование
  • phoneRegionCode — задаёт регион по умолчанию
  • автоматическое добавление пробелов и разделителей
  • динамическая адаптация длины ввода

Базовая идея заключается в том, что библиотека не просто вставляет символы, а анализирует ввод и перераспределяет цифры по логическим блокам.

Простейшая инициализация:

new Cleave(inputElement, {
    phone: true,
    phoneRegionCode: 'RU'
});

Здесь ввод автоматически адаптируется под формат телефонных номеров России.


Региональные коды и их влияние на формат

Ключевая особенность международных номеров — зависимость структуры от региона. Cleave.js использует параметр phoneRegionCode для определения правил форматирования.

Примеры регионов:

  • US — США и Канада (план NANP)
  • GB — Великобритания
  • FR — Франция
  • DE — Германия
  • RU — Россия

Разные регионы влияют на:

  • длину национального номера
  • наличие группировки (3-3-4, 2-2-2-2 и т.д.)
  • необходимость кода страны
  • допустимые префиксы

Пример для США:

new Cleave(inputElement, {
    phone: true,
    phoneRegionCode: 'US'
});

Формат автоматически преобразуется к виду:

(415) 555-2671

Международный формат и код страны

Для поддержки глобального ввода используется концепция международного префикса +. Cleave.js может автоматически обрабатывать символ + и перераспределять ввод в соответствии с международной структурой.

Поведение:

  • + фиксирует начало международного номера
  • последующие цифры интерпретируются как код страны
  • дальше применяется национальный формат

Пример:

new Cleave(inputElement, {
    phone: true,
    phoneRegionCode: 'GB',
    prefix: '+',
    noImmediatePrefix: false
});

При вводе:

+447911123456

результат форматирования:

+44 7911 123456

Поведение при переключении регионов

Важной особенностью является возможность динамической смены региона. Это используется в интерфейсах, где пользователь может выбрать страну перед вводом номера.

Логика работы:

  • пересоздание инстанса Cleave.js
  • либо обновление конфигурации
  • перерасчёт текущего значения

Пример смены региона:

const cleave = new Cleave(inputElement, {
    phone: true,
    phoneRegionCode: 'US'
});

// позже
cleave.destroy();

new Cleave(inputElement, {
    phone: true,
    phoneRegionCode: 'DE'
});

При такой модели важно учитывать, что структура номера полностью перестраивается, и старый ввод может быть переинтерпретирован.


Работа с неполными и частично введёнными номерами

Международные номера редко вводятся полностью сразу. Cleave.js обрабатывает промежуточные состояния ввода:

  • неполный код страны
  • частичный национальный номер
  • смешанный ввод с ошибками форматирования

Механизм обработки основан на:

  • очистке нечисловых символов
  • переупаковке цифр в блоки
  • сохранении позиции курсора

Например:

Ввод:

+1 2125

Может интерпретироваться как:

+1 212 5

с дальнейшей достройкой до корректного формата.


Разделение номера на блоки

Cleave.js использует блочную модель форматирования. Каждая страна имеет собственную схему:

  • США: 3-3-4
  • Великобритания: вариативная длина, часто 4-3-3 или 5-6
  • Франция: 2-2-2-2-2
  • Германия: переменная структура

Эта логика встроена в пресеты библиотеки и не требует ручной настройки.

Пример конфигурации блоков:

new Cleave(inputElement, {
    phone: true,
    phoneRegionCode: 'FR'
});

Поддержка локальных особенностей формата

Международные номера часто включают локальные особенности:

  • ведущие нули (например, Италия)
  • обязательные коды зон
  • различие между мобильными и городскими номерами

Cleave.js частично учитывает эти различия через региональные пресеты, однако не реализует полноценную валидацию операторов связи.


Управление префиксами и маской ввода

Дополнительные параметры позволяют управлять тем, как отображается международный префикс:

  • prefix — строка, добавляемая в начало
  • noImmediatePrefix — контроль появления префикса
  • delimiters — управление разделителями

Пример:

new Cleave(inputElement, {
    phone: true,
    phoneRegionCode: 'RU',
    prefix: '+7',
    noImmediatePrefix: true
});

Поведение:

  • пользователь может начать ввод с цифр
  • префикс появляется после первой значимой цифры
  • формат автоматически выравнивается

Обработка вставки (paste) международных номеров

Особое внимание уделяется вставке номеров из буфера обмена. Международные номера часто копируются из:

  • мессенджеров
  • CRM систем
  • email-подписей

При вставке Cleave.js выполняет:

  1. очистку строки от пробелов, скобок, дефисов
  2. распознавание + и кода страны
  3. повторное форматирование под текущий регион

Пример вставки:

+49 (151) 234-5678

Результат:

+49 151 234 5678

Ограничения международного форматирования

Несмотря на гибкость, существуют системные ограничения:

  • отсутствие полноценной валидации номера по стандартам E.164
  • невозможность определить операторскую структуру номера
  • ограниченная поддержка редких региональных форматов
  • зависимость от встроенных пресетов

Для строгой валидации обычно требуется интеграция с внешними библиотеками, но Cleave.js остаётся инструментом именно форматирования, а не проверки корректности.


Поведение при удалении символов

Удаление символов в международных номерах требует перерасчёта всей структуры:

  • удаление цифры в коде страны меняет весь формат
  • удаление внутри блока приводит к перераспределению оставшихся цифр
  • курсор автоматически корректируется

Пример:

Исходное значение:

+44 7911 123456

Удаление 4 из кода страны:

+4 4791 112 3456

Дальнейшая переработка может изменить структуру полностью в зависимости от региона.


Интеграция с пользовательскими интерфейсами выбора страны

На практике международный ввод почти всегда сочетается с UI-компонентом выбора страны. В такой архитектуре:

  • select определяет phoneRegionCode
  • input пересоздаётся или обновляется
  • значение пересчитывается под новый регион

Пример связки:

countrySelect.addEventListener('change', (e) => {
    const region = e.target.value;

    cleave.destroy();

    cleave = new Cleave(phoneInput, {
        phone: true,
        phoneRegionCode: region
    });
});

Производственные сценарии использования

Международное форматирование особенно важно в системах:

  • регистрации пользователей
  • платёжных форм
  • CRM и ERP системах
  • сервисах доставки
  • SaaS платформах с глобальной аудиторией

В таких системах ключевыми становятся:

  • единообразие хранения номера
  • читаемость ввода
  • минимизация ошибок пользователя
  • адаптация под локальные ожидания

Особенности поведения при нестандартном вводе

При вводе символов, не относящихся к числам:

  • символы игнорируются или удаляются
  • не ломается структура блока
  • не нарушается региональная логика

Например:

+7 (9a8) 123--45b-67

преобразуется в:

+7 981 234 567

Стабильность курсора при международном форматировании

Одной из сложных задач является сохранение позиции курсора при динамическом изменении строки. Cleave.js использует внутренний механизм:

  • вычисление смещения до форматирования
  • пересчёт позиции после вставки разделителей
  • компенсация длины префикса и пробелов

Это особенно важно при работе с длинными международными номерами, где количество преобразований значительно выше, чем в локальных форматах.