409 Stimmen

Führende Nullen für Int in Swift

Ich möchte in Swift einen Int in eine String mit führenden Nullen umwandeln. Betrachten Sie beispielsweise diesen Code:

for myInt in 1 ... 3 {
    print("\(myInt)")
}

Derzeit ist das Ergebnis davon:

1
2
3

Aber ich möchte, dass es so aussieht:

01
02
03

Gibt es eine saubere Möglichkeit, dies innerhalb der Swift-Standardbibliotheken zu tun?

886voto

vacawama Punkte 148405

Angenommen, Sie möchten eine Feldlänge von 2 mit führenden Nullen haben, würden Sie Folgendes tun:

import Foundation

for myInt in 1 ... 3 {
    print(String(format: "%02d", myInt))
}

Ausgabe:

01
02
03

Dies erfordert import Foundation, also ist es technisch gesehen kein Teil der Swift-Sprache, sondern eine Funktion, die vom Foundation-Framework bereitgestellt wird. Beachten Sie, dass sowohl import UIKit als auch import Cocoa Foundation enthalten, sodass es nicht erforderlich ist, es erneut zu importieren, wenn Sie bereits Cocoa oder UIKit importiert haben.


Der Format-String kann das Format mehrerer Elemente spezifizieren. Wenn Sie beispielsweise 3 Stunden, 15 Minuten und 7 Sekunden in 03:15:07 formatieren möchten, könnten Sie dies wie folgt tun:

let hours = 3
let minutes = 15
let seconds = 7
print(String(format: "%02d:%02d:%02d", hours, minutes, seconds))

Ausgabe:

03:15:07

189voto

Imanou Petit Punkte 83480

Mit Swift 5 können Sie eine der drei unten gezeigten Beispiele wählen, um Ihr Problem zu lösen.


1. Verwendung des Initialisierers init(format:_:) von String


Foundation bietet Swift String einen Initialisierer init(format:_:). init(format:_:) hat die folgende Deklaration:

init(format: String, _ arguments: CVarArg...)

Liefert ein String-Objekt, das durch Verwenden einer gegebenen Formatzeichenfolge als Vorlage initialisiert wird, in die die verbleibenden Argumentwerte eingefügt werden.

Der folgende Playground-Code zeigt, wie man einen String formatiert aus einem Int mit mindestens zwei ganzen Ziffern durch Verwendung von init(format:_:):

import Foundation

let string0 = String(format: "%02d", 0) // gibt "00" zurück
let string1 = String(format: "%02d", 1) // gibt "01" zurück
let string2 = String(format: "%02d", 10) // gibt "10" zurück
let string3 = String(format: "%02d", 100) // gibt "100" zurück

2. Verwendung des Initialisierers init(format:arguments:) von String


Foundation bietet Swift String einen Initialisierer init(format:arguments:). init(format:arguments:) hat die folgende Deklaration:

init(format: String, arguments: [CVarArg])

Liefert ein String-Objekt, das durch Verwenden einer gegebenen Formatzeichenfolge als Vorlage initialisiert wird, in die die verbleibenden Argumentwerte gemäß der Standardeinstellung des Benutzers eingesetzt werden.

Der folgende Playground-Code zeigt, wie man einen String formatiert aus einem Int mit mindestens zwei ganzen Ziffern durch Verwendung von init(format:arguments:):

import Foundation

let string0 = String(format: "%02d", arguments: [0]) // gibt "00" zurück
let string1 = String(format: "%02d", arguments: [1]) // gibt "01" zurück
let string2 = String(format: "%02d", arguments: [10]) // gibt "10" zurück
let string3 = String(format: "%02d", arguments: [100]) // gibt "100" zurück

3. Verwendung von NumberFormatter


Foundation bietet NumberFormatter. Apple sagt dazu:

Instanzen von NSNumberFormatter formatieren die textuelle Darstellung von Zellen, die NSNumber-Objekte enthalten, und konvertieren textuelle Darstellungen numerischer Werte in NSNumber-Objekte. Die Darstellung umfasst Ganzzahlen, Floats und Doubles; Floats und Doubles können auf eine bestimmte Dezimalstelle formatiert werden.

Der folgende Playground-Code zeigt, wie man einen NumberFormatter erstellt, der aus einem Int mit mindestens zwei ganzen Ziffern ein String? zurückgibt:

import Foundation

let formatter = NumberFormatter()
formatter.minimumIntegerDigits = 2

let optionalString0 = formatter.string(from: 0) // gibt Optional("00") zurück
let optionalString1 = formatter.string(from: 1) // gibt Optional("01") zurück
let optionalString2 = formatter.string(from: 10) // gibt Optional("10") zurück
let optionalString3 = formatter.string(from: 100) // gibt Optional("100") zurück

18voto

Kiran P Nair Punkte 1933

Um linksen Abstand hinzuzufügen, fügen Sie eine String-Erweiterung wie folgt hinzu:

extension String {

    func padLeft(totalWidth: Int, with byString: String) -> String {
        let toPad = totalWidth - self.count
        if toPad < 1 {
            return self
        }

        return "".padding(toLength: toPad, withPad: byString, startingAt: 0) + self
    }
}

Mit dieser Methode:

for myInt in 1...3 {
    print("\(myInt)".padLeft(totalWidth: 2, with: "0"))
}

11voto

John Cromie Punkte 171

Swift 3.0+

Linkspolsterung String Erweiterung ähnlich wie padding(toLength:withPad:startingAt:) in Foundation

extension String {
    func leftPadding(toLength: Int, withPad: String = " ") -> String {

        guard toLength > self.characters.count else { return self }

        let padding = String(repeating: withPad, count: toLength - self.characters.count)
        return padding + self
    }
}

Verwendung:

let s = String(123)
s.leftPadding(toLength: 8, withPad: "0") // "00000123"

8voto

mxcl Punkte 25282

Mit der neuen erweiterbaren Interpolation in Swift 5:

extension DefaultStringInterpolation {
    mutating func appendInterpolation(pad value: Int, toWidth width: Int, using paddingCharacter: Character = "0") {
        appendInterpolation(String(format: "%\(paddingCharacter)\(width)d", value))
    }
}

let pieCount = 3
print("Ich habe \(pad: pieCount, toWidth: 3, using: "0") Torten gegessen")  // => `Ich habe 003 Torten gegessen`
print("Ich habe \(pad: 1205, toWidth: 3, using: "0") Torten gegessen")  // => `Ich habe 1205 Torten gegessen`

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X