Zéros non significatifs dans Int en Swift : du chaos à l'ordre

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

« Zéros disparus » : pourquoi Int ne stocke pas les zéros non significatifs et comment vivre avec ?

\n\n

Avez-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 ? ».

\n\n

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.

\n\n

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 !

\n\n

Pourquoi Int ne peut-il pas stocker « 001 » ? Petit rappel

\n\n

Avant 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.

\n\n
let number = 007 // Erreur ? Non !\nprint(number) // Affiche : 7
\n\n

Le 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).

\n\n

Méthode n°1 : La classique — String(format:)

\n\n

La 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.

\n\n

Exemple : ajouter 3 zéros non significatifs

\n\n
let number = 7\nlet formatted = String(format: "%04d", number)\nprint(formatted) // "0007"
\n\n

Le spécificateur %04d signifie :

\n
    \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
\n\n

Si le nombre est plus long que 4 caractères (par exemple, 12345), le formatage ne le tronquera pas — vous obtiendrez « 12345 ».

\n\n

Avantages et inconvénients

\n
    \n
  • Avantages : Simple, rapide, une seule ligne. Fonctionne dans toutes les versions de Swift.
  • \n
  • Inconvénients : Utilise NSString en 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
\n\n

Quand l'utiliser : Pour les cas simples : journaux, débogage, affichage d'ID, lorsque la localisation n'est pas nécessaire.

\n\n

Méthode n°2 : Swift pur — String(repeating:count:) + suffixe

\n\n

Si 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\n
extension 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\n

Comment ça fonctionne ?

\n
    \n
  1. Convertir Int en chaîne.
  2. \n
  3. Calculer combien de zéros ajouter : totalDigits - length. Si

Blogs

Book Recommendations