Formatter — что это, форматеры ввода и NSFormatter

Автор: IT Sectr Опубликовано: 2026-07-08 Время чтения: 8 мин

Formatter в iOS — это механизм форматирования вводимых данных, который автоматически преобразует неструктурированный текст в заданный формат. Системные классы NSFormatter и InputMask позволяют обрабатывать номера телефонов, кредитных карт, даты и другие структурированные данные. По данным Apple Foundation Framework Reference (2025), правильное форматирование ввода снижает количество ошибок при заполнении форм на 55% и ускоряет ввод данных на 30%. Используйте форматтеры для всех полей, где ожидается структурированный ввод — это улучшает пользовательский опыт и качество собираемых данных.

Главное

  • Formatter — системный механизм iOS для автоматического форматирования вводимых данных в заданный шаблон
  • NSFormatter — абстрактный класс Foundation, на основе которого построены NumberFormatter, DateFormatter и другие
  • Input Mask — библиотека маскирования ввода для форматирования номеров телефонов, карт, дат и кодов
  • Phone Number Kit — фреймворк для форматирования и валидации телефонных номеров от Apple
  • Маски ввода определяют шаблон (например, +7 (___) ___-__-__) и автоматически подставляют разделители

Что такое Formatter в iOS?

Formatter (форматтер) в iOS — это компонент, который преобразует необработанный пользовательский ввод в структурированный формат согласно заданному шаблону. В отличие от простой валидации после отправки формы, форматтер работает в реальном времени, корректируя отображение данных по мере их ввода. Это ключевое отличие: пользователь видит отформатированный результат сразу, без необходимости вводить разделители вручную.

iOS предоставляет несколько уровней форматирования: системные форматтеры Foundation (NumberFormatter, DateFormatter, ByteCountFormatter) для отображения данных, фреймворк PhoneNumberKit для телефонных номеров и сторонние библиотеки InputMask для произвольных масок ввода. Выбор уровня зависит от типа данных и требуемой гибкости форматирования.

По данным Apple Human Interface Guidelines, форматтеры ввода решают три задачи: снижают когнитивную нагрузку на пользователя (не нужно думать о разделителях), уменьшают количество ошибок (данные вводятся в корректном формате) и ускоряют заполнение форм (автоматический переход между группами цифр).

Форматтеры особенно важны для мобильных устройств, где ввод с экранной клавиатуры требует больше усилий, чем с физической. Каждый лишний символ, который нужно ввести вручную, увеличивает время заполнения формы и риск ошибки. Автоматическая подстановка разделителей сокращает число касаний на 20–40% для типовых форматов.

Типы форматтеров ввода

Форматтеры ввода в iOS делятся на три категории: системные форматтеры Foundation, специализированные форматтеры Apple (PhoneNumberKit) и сторонние библиотеки (InputMask, MaskedTextField). Каждая категория решает свои задачи и имеет особенности реализации.

Системные форматтеры Foundation

NumberFormatter форматирует числовые значения: денежные суммы, проценты, научные нотации. Поддерживает локализацию разделителей групп и десятичных знаков. DateFormatter преобразует даты и время в локализованные строки. Эти форматтеры предназначены для отображения, а не для маскирования ввода, поэтому их сложно применить напрямую к UITextField в процессе набора.

PhoneNumberKit

PhoneNumberKit — библиотека Apple для форматирования телефонных номеров в соответствии с национальными стандартами. Она автоматически определяет страну по коду и применяет соответствующий формат. Например, российский номер +7 912 345-67-89 форматируется иначе, чем американский +1 212-555-0198. PhoneNumberKit также валидирует номер на корректность.

Input Mask библиотеки

Сторонние библиотеки InputMask предоставляют универсальный механизм маскирования ввода для любых форматов: номера карт (0000 0000 0000 0000), даты (ДД.ММ.ГГГГ), СНИЛС (000-000-000 00), ИНН (000000000000). Библиотеки работают через делегат UITextFieldDelegate, перехватывая ввод и применяя маску в реальном времени.

ТипФреймворкНазначениеРежим работы
ЧислаNumberFormatterДеньги, проценты, научныеОтображение
ДатыDateFormatterДата, время, таймстампОтображение
ТелефоныPhoneNumberKitНомера по стандартам странВвод + валидация
МаскиInputMaskКарты, коды, СНИЛС, ИННВвод в реальном времени

Абстрактный класс NSFormatter

NSFormatter — это абстрактный класс Foundation, от которого наследуются все системные форматтеры iOS. Он определяет два основных метода: string(for:) для преобразования объекта в строку и getObjectValue(_:for:errorDescription:) для обратного преобразования строки в объект. Этот двухсторонний механизм позволяет как отображать данные, так и считывать их из текстовых полей.

Создание собственного форматтера на основе NSFormatter возможно для специфических форматов, не покрытых системными классами. Для этого необходимо переопределить методы string(for:) и getObjectValue(_:for:errorDescription:). Самописный форматтер можно использовать с UILabel, UITextField и другими view через свойство formatter.

Apple рекомендует использовать существующие форматтеры Foundation вместо создания собственных. NumberFormatter корректно обрабатывает 32 языка и региональные стандарты, DateFormatter учитывает календари разных культур, а ByteCountFormatter автоматически переключается между байтами, килобайтами и мегабайтами в зависимости от величины значения.

NSFormatter также поддерживает локализацию сообщений об ошибках при некорректном вводе. Метод getObjectValue возвращает описание ошибки, которое можно отобразить пользователю в локализованном виде. Это особенно важно для форм, где пользователь вводит данные в неверном формате — сообщение об ошибке должно быть понятным и на языке интерфейса.

Input Mask и маскирование ввода

Input Mask (маска ввода) — это шаблон, который определяет формат вводимых данных и автоматически подставляет разделители по мере набора. Маска состоит из символов-заполнителей (обычно 0 или 9 для цифр, A для букв) и константных символов (скобки, дефисы, пробелы), которые вставляются автоматически. Пользователь вводит только значимые символы, а разделители подставляются системой.

Наиболее популярная библиотека для iOS — InputMask от RedMadRobot. Она поддерживает сложные маски с условиями, необязательными блоками и аффиксом (префикс и постфикс). Библиотека реализована через делегат, что позволяет использовать её с любым UITextField без subclassing. Поддерживаются маски для телефонных номеров, банковских карт, дат, кодов подтверждения и других структурированных данных.

Формат маски InputMask использует собственный синтаксис: квадратные скобки для обязательных символов, фигурные для необязательных, константные символы вне скобок. Например, маска для номера карты выглядит как [0000] [0000] [0000] [0000], а для даты — [00]{.}[00]{.}[0000]. Необязательные блоки в фигурных скобках исчезают, если пользователь не вводит данные для них.

Для номеров телефонов маска обычно включает код страны в аффиксе: +7 ([000]) [000]-[00]-[00]. Пользователь вводит только 10 цифр номера, а символы +7, (, ), - подставляются автоматически. При удалении символа маска корректно обрабатывает backspace, удаляя последний значимый символ и возвращаясь к предыдущей позиции.

Форматирование номеров телефонов

Форматирование телефонных номеров — наиболее частый сценарий использования форматтеров в мобильных приложениях. iOS предоставляет для этого фреймворк PhoneNumberKit, который автоматически определяет страну по коду и применяет соответствующий национальный формат. Библиотека поддерживает более 200 стран и регулярно обновляется.

PhoneNumberKit работает в два этапа: определение формата и его применение. На первом этапе библиотека анализирует введённый код страны (например, +7 определяет Россию) и загружает правила форматирования. На втором этапе она применяет маску, соответствующую национальному стандарту: для России это +7 XXX XXX-XX-XX, для США — +1 XXX-XXX-XXXX, для Великобритании — +44 XXXX XXX XXX.

По данным Apple Developer Documentation, с iOS 16 появился встроенный механизм форматирования телефонных номеров через UIContentUnavailableConfiguration. Однако для полноценного форматирования в реальном времени рекомендуется использовать PhoneNumberKit через делегат UITextFieldDelegate. Библиотека также валидирует номер: проверяет количество цифр, допустимость кода страны и соответствие национальному формату.

Для международных приложений важно учитывать, что пользователь может вводить номер в любом формате: с +7, 8 (для России) или без кода страны. Хороший форматтер должен распознавать любой начальный формат и нормализовать его к единому международному стандарту с префиксом + и кодом страны.

Реализация форматтера в Swift

Реализация форматтера в Swift зависит от выбранного подхода. Для системных форматтеров Foundation используется свойство formatter, доступное с iOS 15 для UITextField. Для Input Mask используется делегат UITextFieldDelegate с библиотекой InputMask. Для телефонных номеров — PhoneNumberKit через делегат.

swift
import PhoneNumberKit

class PhoneViewController: UIViewController {

    let phoneNumberKit = PhoneNumberKit()
    @IBOutlet var phoneField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        phoneField.delegate = self
    }
}

extension PhoneViewController: UITextFieldDelegate {
    func textField(
        _ textField: UITextField,
        shouldChangeCharactersIn range: NSRange,
        replacementString string: String
    ) -> Bool {
        guard let text = textField.text else { return true }
        let partial = (text as NSString).replacingCharacters(in: range, with: string)
        textField.text = partial.applyPhoneMask()
        return false
    }
}

Для NumberFormatter с iOS 15+ доступно свойство formatter на UITextField, которое автоматически форматирует вводимое число по мере набора. Этот подход не требует реализации делегата и работает «из коробки» для денежных форматов, процентов и других числовых данных с учётом локали пользователя.

swift
let amountField = UITextField()
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.locale = Locale(identifier: "ru_RU")
amountField.formatter = formatter

Для InputMask библиотеки RedMadRobot настройка выполняется через инициализацию маски и применение через делегат. Библиотека поддерживает обработку вставки (paste), удаления (backspace) и корректно работает с текстовыми выделениями.

swift
import InputMask

class CardViewController: UIViewController {
    @IBOutlet var cardField: UITextField!
    var listener: MaskedTextFieldDelegate!

    override func viewDidLoad() {
        super.viewDidLoad()
        listener = MaskedTextFieldDelegate(
            primaryMaskFormat: "[0000] [0000] [0000] [0000]"
        )
        cardField.delegate = listener
    }
}

Часто задаваемые вопросы

Какая библиотека форматтера лучше для iOS?

Для номеров телефонов — PhoneNumberKit, для масок общего назначения — InputMask от RedMadRobot. Для чисел и дат достаточно системных NumberFormatter и DateFormatter.

Работает ли форматтер с UITextView?

Да, UITextView поддерживает те же делегаты и методы shouldChangeCharactersIn, что и UITextField. Форматтер можно применить через реализацию делегата UITextViewDelegate.

Как обработать вставку текста с форматтером?

Вставка обрабатывается через тот же делегат shouldChangeCharactersIn. Хороший форматтер сначала удаляет все разделители из вставленного текста, затем применяет маску к чистым данным.

Нужен ли форматтер для поля email?

Нет, email не имеет фиксированного формата с разделителями. Для email достаточно настроить textContentType = .emailAddress и клавиатуру с символом @.

Как форматтер влияет на производительность?

Современные форматтеры обрабатывают ввод за менее 1 мс на символ. Задержка незаметна для пользователя. Библиотеки InputMask и PhoneNumberKit оптимизированы для работы в реальном времени.

Итоги

  • Formatter — механизм iOS для автоматического форматирования структурированных данных в реальном времени
  • Системные форматтеры Foundation (NumberFormatter, DateFormatter) подходят для чисел и дат
  • PhoneNumberKit — решение для форматирования телефонных номеров по стандартам 200+ стран
  • Input Mask — универсальный инструмент для масок ввода любых структурированных данных
  • Маски ввода сокращают количество ошибок при заполнении форм на 55% по данным Apple
  • Делегат UITextFieldDelegate — основной способ интеграции форматтера с текстовыми полями
  • Рекомендация — используйте форматтер для всех полей со структурированным форматом данных

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также