« Zéros disparus » : pourquoi Int ne stocke pas les zéros non significatifs et comment vivre avec ?
\n\nAvez-vous déjà essayé d'afficher le nombre 007 et obtenu simplement 7 ? Une douleur familière ? Bienvenue dans le club des développeurs Swift qui, tôt ou tard, se posent la question : « Comment ajouter des zéros non significatifs à un Int ? ».
Cette question sur Stack Overflow a recueilli des milliers de vues, et ce n'est pas surprenant. Apparemment, une tâche simple — afficher un numéro de commande comme « 001234 » au lieu de « 1234 », ou afficher l'heure comme « 09:05 » au lieu de « 9:5 ». Mais Swift, étant un langage fortement typé, sépare le concept de « nombre » et de « sa représentation textuelle ». Int est une entité mathématique. 007 pour lui est simplement 7. Les zéros non significatifs sont perdus lors de l'initialisation.
Dans cet article, nous allons passer en revue toutes les approches principales pour résoudre ce problème. Vous apprendrez à formater correctement les nombres entiers, quelle méthode choisir pour différentes tâches et comment éviter les pièges de performance. Nous irons des simples masques de chaîne au puissant NumberFormatter de Foundation. C'est parti !
Pourquoi Int ne peut-il pas stocker « 001 » ? Petit rappel
\n\nAvant de plonger dans le code, comprenons la nature du phénomène. Int en Swift est un entier signé 64 bits (ou 32 bits sur les anciens appareils). Sa représentation interne est le code binaire. Un zéro à gauche n'a pas de sens mathématique.
let number = 007 // Erreur ? Non !\nprint(number) // Affiche : 7\n\nLe compilateur Swift ne vous permettra même pas d'écrire 007 dans le code (sauf s'il s'agit d'un littéral en système octal, mais là le préfixe est 0o). Conclusion : les zéros non significatifs sont un problème de formatage, pas de stockage de données. Nous résolvons le problème au niveau de la représentation (UI, journalisation, export).
Méthode n°1 : La classique — String(format:)
\n\nLa réponse la plus populaire sur Stack Overflow — utiliser la fonction String(format:), héritée d'Objective-C (via le pont avec NSString). C'est un moyen rapide et concis.
Exemple : ajouter 3 zéros non significatifs
\n\nlet number = 7\nlet formatted = String(format: "%04d", number)\nprint(formatted) // "0007"\n\nLe spécificateur %04d signifie :
- \n
%— début du spécificateur ; \n 0— remplir les positions vides avec des zéros, pas des espaces ; \n 4— largeur minimale du champ (4 caractères) ; \n d— nombre entier décimal (Int). \n
Si le nombre est plus long que 4 caractères (par exemple, 12345), le formatage ne le tronquera pas — vous obtiendrez « 12345 ».
\n\nAvantages et inconvénients
\n- \n
- Avantages : Simple, rapide, une seule ligne. Fonctionne dans toutes les versions de Swift. \n
- Inconvénients : Utilise
NSStringen interne, ce qui peut être légèrement plus lent qu'une solution pure Swift. Nécessite de se souvenir de la syntaxe de formatage de style C. Non localisé (ne prend pas en compte les séparateurs de milliers, si nécessaire). \n
Quand l'utiliser : Pour les cas simples : journaux, débogage, affichage d'ID, lorsque la localisation n'est pas nécessaire.
\n\nMéthode n°2 : Swift pur — String(repeating:count:) + suffixe
\n\nSi vous voulez éviter le pont Objective-C et écrire en Swift « pur », vous pouvez le faire manuellement. C'est un excellent exercice pour comprendre les chaînes.
\n\nextension Int {\n func leadingZeros(_ totalDigits: Int) -> String {\n let stringValue = String(self)\n let zerosCount = max(0, totalDigits - stringValue.count)\n return String(repeating: "0", count: zerosCount) + stringValue\n }\n}\n\nlet number = 42\nprint(number.leadingZeros(5)) // "00042"\n\nComment ça fonctionne ?
\n- \n
- Convertir Int en chaîne. \n
- Calculer combien de zéros ajouter :
totalDigits - length. Si