Formatter dans iOS est un mécanisme de formatage des données saisies qui convertit automatiquement le texte non structuré dans un format spécifié. Les classes système NSFormatter et InputMask permettent de traiter les numéros de téléphone, les cartes de crédit, les dates et autres données structurées. Selon l’Apple Foundation Framework Reference (2025), un formatage correct des saisies réduit les erreurs de remplissage de formulaires de 55% et accélère la saisie des données de 30%. Utilisez des formatteurs pour tous les champs où une saisie structurée est attendue — cela améliore l’expérience utilisateur et la qualité des données collectées.
Points clés
Formatter dans iOS est un composant qui convertit la saisie brute de l’utilisateur dans un format structuré selon un modèle donné. Contrairement à la validation simple après soumission du formulaire, un formatteur fonctionne en temps réel, corrigeant l’affichage des données au fur et à mesure de la saisie. C’est la différence clé : l’utilisateur voit le résultat formaté immédiatement, sans avoir à saisir les séparateurs manuellement.
iOS propose plusieurs niveaux de formatage : les formatteurs système Foundation (NumberFormatter, DateFormatter, ByteCountFormatter) pour l’affichage des données, le framework PhoneNumberKit pour les numéros de téléphone et les bibliothèques tierces InputMask pour les masques de saisie personnalisés. Le choix du niveau dépend du type de données et de la flexibilité de formatage requise.
Selon les Apple Human Interface Guidelines, les formatteurs de saisie résolvent trois tâches : réduire la charge cognitive de l’utilisateur (pas besoin de penser aux séparateurs), diminuer le nombre d’erreurs (les données sont saisies dans le bon format) et accélérer le remplissage des formulaires (transition automatique entre les groupes de chiffres).
Les formatteurs sont particulièrement importants pour les appareils mobiles, où la saisie avec un clavier virtuel demande plus d’effort qu’avec un clavier physique. Chaque caractère supplémentaire à saisir manuellement augmente le temps de remplissage du formulaire et le risque d’erreur. L’insertion automatique des séparateurs réduit le nombre de frappes de 20 à 40% pour les formats typiques.
Les formatteurs de saisie dans iOS se divisent en trois catégories : les formatteurs système Foundation, les formatteurs spécialisés Apple (PhoneNumberKit) et les bibliothèques tierces (InputMask, MaskedTextField). Chaque catégorie résout ses propres tâches et a des particularités d’implémentation.
NumberFormatter formate les valeurs numériques : montants monétaires, pourcentages, notations scientifiques. Prend en charge la localisation des séparateurs de groupes et de décimales. DateFormatter convertit les dates et heures en chaînes localisées. Ces formatteurs sont conçus pour l’affichage, pas pour le masquage de saisie, donc difficiles à appliquer directement à UITextField pendant la frappe.
PhoneNumberKit est une bibliothèque Apple pour formater les numéros de téléphone selon les normes nationales. Elle détecte automatiquement le pays par indicatif et applique le format correspondant. Par exemple, un numéro russe +7 912 345-67-89 est formaté différemment d’un numéro américain +1 212-555-0198. PhoneNumberKit valide également l’exactitude du numéro.
Les bibliothèques tierces InputMask fournissent un mécanisme universel de masquage de saisie pour tout format : numéros de carte (0000 0000 0000 0000), dates (JJ.MM.AAAA), SNILS (000-000-000 00), INN (000000000000). Les bibliothèques fonctionnent via le délégué UITextFieldDelegate, interceptant la saisie et appliquant le masque en temps réel.
| Type | Framework | Objectif | Mode |
|---|---|---|---|
| Nombres | NumberFormatter | Argent, pourcentages, scientifiques | Affichage |
| Dates | DateFormatter | Date, heure, timestamp | Affichage |
| Téléphones | PhoneNumberKit | Numéros par normes pays | Saisie + validation |
| Masques | InputMask | Cartes, codes, SNILS, INN | Saisie en temps réel |
NSFormatter est une classe abstraite de Foundation dont héritent tous les formatteurs système iOS. Elle définit deux méthodes principales : string(for:) pour convertir un objet en chaîne et getObjectValue(_:for:errorDescription:) pour la conversion inverse d’une chaîne en objet. Ce mécanisme bidirectionnel permet à la fois d’afficher les données et de les lire à partir de champs de texte.
La création d’un formatteur personnalisé basé sur NSFormatter est possible pour des formats spécifiques non couverts par les classes système. Pour cela, il faut surcharger les méthodes string(for:) et getObjectValue(_:for:errorDescription:). Un formatteur personnalisé peut être utilisé avec UILabel, UITextField et d’autres vues via la propriété formatter.
Apple recommande d’utiliser les formatteurs existants de Foundation plutôt que d’en créer des personnalisés. NumberFormatter gère correctement 32 langues et standards régionaux, DateFormatter prend en compte les calendriers de différentes cultures, et ByteCountFormatter bascule automatiquement entre les octets, kilooctets et mégaoctets selon la taille de la valeur.
NSFormatter prend également en charge la localisation des messages d’erreur pour les saisies incorrectes. La méthode getObjectValue renvoie une description de l’erreur qui peut être affichée à l’utilisateur sous forme localisée. Ceci est particulièrement important pour les formulaires où l’utilisateur saisit des données dans un format incorrect — le message d’erreur doit être compréhensible et dans la langue de l’interface.
Input Mask (masque de saisie) est un modèle qui définit le format des données saisies et insère automatiquement des séparateurs au fur et à mesure de la frappe. Le masque se compose de caractères de substitution (généralement 0 ou 9 pour les chiffres, A pour les lettres) et de caractères constants (parenthèses, tirets, espaces) qui sont insérés automatiquement. L’utilisateur ne saisit que les caractères significatifs, et les séparateurs sont insérés par le système.
La bibliothèque la plus populaire pour iOS est InputMask de RedMadRobot. Elle prend en charge les masques complexes avec conditions, blocs optionnels et affixes (préfixe et suffixe). La bibliothèque est implémentée via un délégué, ce qui permet de l’utiliser avec n’importe quel UITextField sans sous-classement. Les masques sont pris en charge pour les numéros de téléphone, les cartes bancaires, les dates, les codes de confirmation et autres données structurées.
Le format du masque InputMask utilise sa propre syntaxe : crochets pour les caractères obligatoires, accolades pour les optionnels, caractères constants en dehors des crochets. Par exemple, un masque de numéro de carte ressemble à [0000] [0000] [0000] [0000], et un masque de date à [00]{.}[00]{.}[0000]. Les blocs optionnels entre accolades disparaissent si l’utilisateur ne saisit pas de données pour eux.
Pour les numéros de téléphone, le masque inclut généralement l’indicatif du pays dans l’affixe : +7 ([000]) [000]-[00]-[00]. L’utilisateur ne saisit que les 10 chiffres du numéro, tandis que les caractères +7, (, ), - sont insérés automatiquement. Lors de la suppression d’un caractère, le masque gère correctement la touche retour arrière, supprimant le dernier caractère significatif et revenant à la position précédente.
Le formatage des numéros de téléphone est le cas d’utilisation le plus fréquent des formatteurs dans les applications mobiles. iOS fournit le framework PhoneNumberKit à cet effet, qui détermine automatiquement le pays par indicatif et applique le format national correspondant. La bibliothèque prend en charge plus de 200 pays et est régulièrement mise à jour.
PhoneNumberKit fonctionne en deux étapes : la détection du format et son application. Dans la première étape, la bibliothèque analyse l’indicatif du pays saisi (par exemple, +7 identifie la Russie) et charge les règles de formatage. Dans la deuxième étape, elle applique un masque correspondant à la norme nationale : pour la Russie c’est +7 XXX XXX-XX-XX, pour les États-Unis — +1 XXX-XXX-XXXX, pour le Royaume-Uni — +44 XXXX XXX XXX.
Selon la documentation Apple Developer, depuis iOS 16, un mécanisme intégré de formatage des numéros de téléphone est apparu via UIContentUnavailableConfiguration. Cependant, pour un formatage complet en temps réel, il est recommandé d’utiliser PhoneNumberKit via le délégué UITextFieldDelegate. La bibliothèque valide également le numéro : elle vérifie le nombre de chiffres, la validité de l’indicatif du pays et la conformité au format national.
Pour les applications internationales, il est important de considérer que l’utilisateur peut saisir le numéro dans n’importe quel format : avec +7, 8 (pour la Russie) ou sans indicatif du pays. Un bon formatteur doit reconnaître tout format initial et le normaliser en un standard international unique avec le préfixe + et l’indicatif du pays.
L’implémentation du formatteur en Swift dépend de l’approche choisie. Pour les formatteurs système Foundation, on utilise la propriété formatter, disponible depuis iOS 15 pour UITextField. Pour Input Mask, on utilise le délégué UITextFieldDelegate avec la bibliothèque InputMask. Pour les numéros de téléphone — PhoneNumberKit via le délégué.
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
}
}
Pour NumberFormatter avec iOS 15+, la propriété formatter est disponible sur UITextField, qui formate automatiquement le nombre saisi au fur et à mesure de la frappe. Cette approche ne nécessite pas d’implémenter un délégué et fonctionne dès le départ pour les formats monétaires, les pourcentages et autres données numériques en tenant compte des paramètres régionaux de l’utilisateur.
let amountField = UITextField()
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.locale = Locale(identifier: "ru_RU")
amountField.formatter = formatter
Pour la bibliothèque InputMask de RedMadRobot, la configuration se fait par l’initialisation du masque et l’application via un délégué. La bibliothèque prend en charge la gestion du collage, la suppression par retour arrière et fonctionne correctement avec les sélections de texte.
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
}
}
Foire aux questions
Pour les numéros de téléphone — PhoneNumberKit, pour les masques généraux — InputMask de RedMadRobot. Pour les nombres et les dates, les formatteurs système NumberFormatter et DateFormatter suffisent.
Oui, UITextView prend en charge les mêmes délégués et méthodes shouldChangeCharactersIn que UITextField. Le formatteur peut être appliqué en implémentant le délégué UITextViewDelegate.
Le collage est géré via le même délégué shouldChangeCharactersIn. Un bon formatteur supprime d’abord tous les séparateurs du texte collé, puis applique le masque aux données propres.
Non, l’email n’a pas de format fixe avec séparateurs. Pour l’email, il suffit de configurer textContentType = .emailAddress et un clavier avec le symbole @.
Les formatteurs modernes traitent la saisie en moins de 1 ms par caractère. Le délai est imperceptible pour l’utilisateur. Les bibliothèques InputMask et PhoneNumberKit sont optimisées pour un fonctionnement en temps réel.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi