„Verschwundene“ Nullen: Warum Int keine führenden Nullen speichert und wie man damit lebt?
\n\nHaben Sie jemals versucht, die Zahl 007 auf dem Bildschirm anzuzeigen und nur 7 erhalten? Ein bekanntes Problem? Willkommen im Club der Swift-Entwickler, die früher oder später auf die Frage stoßen: „Wie füge ich führende Nullen zu Int hinzu?“.
Diese Frage auf Stack Overflow hat tausende Aufrufe, und das ist nicht verwunderlich. Es scheint eine einfache Aufgabe zu sein – eine Bestellnummer als „001234“ statt „1234“ anzuzeigen oder die Zeit als „09:05“ statt „9:5“. Aber Swift, als streng typisierte Sprache, trennt das Konzept „Zahl“ und „ihre String-Darstellung“. Int ist eine mathematische Entität. 007 ist für ihn einfach 7. Führende Nullen gehen bei der Initialisierung verloren.
In diesem Artikel analysieren wir alle grundlegenden Ansätze zur Lösung dieses Problems. Sie erfahren, wie man ganze Zahlen richtig formatiert, welche Methode man für verschiedene Aufgaben wählt und wie man nicht in eine Performance-Falle tappt. Wir gehen den Weg von einfachen String-Masken bis zum leistungsstarken NumberFormatter aus Foundation. Los geht's!
Warum kann Int „001“ nicht speichern? Eine kurze Einführung
\n\nBevor wir in den Code eintauchen, lassen Sie uns die Natur des Phänomens verstehen. Int in Swift ist eine 64-Bit (oder 32-Bit auf älteren Geräten) ganze Zahl mit Vorzeichen. Ihre interne Darstellung ist Binärcode. Eine Null links hat keine mathematische Bedeutung.
let number = 007 // Fehler? Nein!\nprint(number) // Gibt aus: 7\n\nDer Swift-Compiler erlaubt es Ihnen nicht einmal, 007 im Code zu schreiben (es sei denn, es handelt sich um ein Literal im Oktalsystem, aber dort gibt es das Präfix 0o). Fazit: Führende Nullen sind ein Problem der Formatierung, nicht der Datenspeicherung. Wir lösen die Aufgabe auf der Darstellungsebene (UI, Logging, Export).
Methode Nr. 1: Klassiker – String(format:)
\n\nDie beliebteste Antwort auf Stack Overflow ist die Verwendung der Funktion String(format:), die von Objective-C (über die Brücke zu NSString) geerbt wurde. Dies ist eine schnelle und prägnante Methode.
Beispiel: 3 führende Nullen hinzufügen
\n\nlet number = 7\nlet formatted = String(format: "%04d", number)\nprint(formatted) // "0007"\n\nDer Formatbezeichner %04d bedeutet:
- \n
%– Beginn des Formatbezeichners; \n 0– leere Stellen mit Nullen füllen, nicht mit Leerzeichen; \n 4– minimale Feldbreite (4 Zeichen); \n d– dezimale ganze Zahl (Int). \n
Wenn die Zahl länger als 4 Zeichen ist (z.B. 12345), wird die Formatierung sie nicht abschneiden – Sie erhalten „12345“.
\n\nVor- und Nachteile
\n- \n
- Vorteile: Einfach, schnell, eine Zeile. Funktioniert in allen Swift-Versionen. \n
- Nachteile: Verwendet
NSStringunter der Haube, was etwas langsamer sein kann als eine reine Swift-Lösung. Man muss die C-style Formatierungssyntax kennen. Nicht lokalisiert (berücksichtigt keine Tausendertrennzeichen, falls benötigt). \n
Wann verwenden: Für einfache Fälle: Logs, Debugging, Ausgabe von IDs, wenn keine Lokalisierung erforderlich ist.
\n\nMethode Nr. 2: Reines Swift – String(repeating:count:) + Suffix
\n\nWenn Sie die Objective-C-Brücke vermeiden und in „reinem“ Swift schreiben möchten, können Sie dies manuell tun. Dies ist eine hervorragende Übung zum Verständnis von Strings.
\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\nWie funktioniert das?
\n- \n
- Wandelt Int in einen String um. \n
- Berechnet, wie viele Nullen hinzugefügt werden müssen:
totalDigits - length. Wenn