web-dev-qa-db-de.com

Führende Nullen für Int in Swift

Ich möchte ein Int in Swift in ein String mit führenden Nullen konvertieren. Betrachten Sie zum Beispiel diesen Code:

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

Derzeit ist das Ergebnis davon:

1
2
3

Aber ich möchte es sein:

01
02
03

Gibt es einen sauberen Weg, dies in den Swift-Standardbibliotheken zu tun?

229
Dschee

Angenommen, Sie möchten eine Feldlänge von 2 mit führenden Nullen, so 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, so dass es technisch nicht Teil der Swift-Sprache ist, sondern eine durch das Foundation-Framework bereitgestellte Funktion. Beachten Sie, dass sowohl import UIKit als auch import CocoaFoundation enthalten. Sie müssen also nicht erneut importiert werden, wenn Sie Cocoa oder UIKit bereits importiert haben.


Die Formatzeichenfolge kann das Format mehrerer Elemente angeben. Wenn Sie beispielsweise versuchen, 3 Stunden, 15 Minuten und 7 Sekunden in 03:15:07 zu formatieren, können Sie dies folgendermaßen tun:

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

ausgabe:

03:15:07
513
vacawama

Mit Swift 4.2 können Sie eines der unten gezeigten drei Beispiele auswählen, um Ihr Problem zu lösen.


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

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

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

Gibt ein String-Objekt zurück, das unter Verwendung einer angegebenen Formatzeichenfolge als Vorlage initialisiert wurde, in die die restlichen Argumentwerte eingesetzt werden.

Der folgende Code für ein Spielfeld zeigt, wie Sie eine String erstellen, die aus Int mit mindestens zwei ganzen Zahlen mit init(format:_:) formatiert ist:

import Foundation

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

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

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

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

Gibt ein String-Objekt zurück, das unter Verwendung einer angegebenen Formatzeichenfolge als Vorlage initialisiert wurde, in die die restlichen Argumentwerte gemäß der Standardeinstellung des Benutzers ersetzt werden.

Der folgende Code für ein Spielfeld zeigt, wie Sie eine String erstellen, die aus Int mit mindestens zwei ganzen Zahlen mit init(format:arguments:) formatiert ist:

import Foundation

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

#3. NumberFormatter verwenden

Foundation bietet NumberFormatter . Apple sagt dazu:

Instanzen von NSNumberFormatter formatieren die Textdarstellung von Zellen, die NSNumber-Objekte enthalten, und konvertieren Textdarstellungen von numerischen Werten 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 Sie eine NumberFormatter erstellen, die String? aus einer Int mit mindestens zwei Ganzzahlen zurückgibt:

import Foundation

let formatter = NumberFormatter()
formatter.minimumIntegerDigits = 2

let optionalString0 = formatter.string(from: 0) // returns Optional("00")
let optionalString1 = formatter.string(from: 1) // returns Optional("01")
let optionalString2 = formatter.string(from: 10) // returns Optional("10")
let optionalString3 = formatter.string(from: 100) // returns Optional("100")
122
Imanou Petit

Fügen Sie für die linke Auffüllung eine Zeichenfolgenerweiterung hinzu:

Swift 2.0 +

extension String {
    func padLeft (totalWidth: Int, with: String) -> String {
        let toPad = totalWidth - self.characters.count
        if toPad < 1 { return self }
        return "".stringByPaddingToLength(toPad, withString: with, startingAtIndex: 0) + self
    }
}

Swift 3.0 +

extension String {
    func padLeft (totalWidth: Int, with: String) -> String {
        let toPad = totalWidth - self.characters.count
        if toPad < 1 { return self }
        return "".padding(toLength: toPad, withPad: with, startingAt: 0) + self
    }
}

Mit dieser Methode:

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

Swift 3.0+

Linke Auffüllung String-Erweiterung ähnlich 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
    }
}

Verwendungszweck:

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

in Xcode 8.3.2, iOS 10.3 Das ist gut bis jetzt

Probe1:

let dayMoveRaw = 5 
let dayMove = String(format: "%02d", arguments: [dayMoveRaw])
print(dayMove) // 05

Probe2:

let dayMoveRaw = 55 
let dayMove = String(format: "%02d", arguments: [dayMoveRaw])
print(dayMove) // 55
2
Steffen

Die anderen Antworten sind gut, wenn Sie sich nur mit Zahlen befassen, die die Formatzeichenfolge verwenden. Dies ist jedoch gut, wenn Sie Zeichenfolgen haben, die aufgefüllt werden müssen (obwohl zugegebenermaßen etwas anders ist als die gestellte Frage, was im Geiste ähnlich ist). Seien Sie auch vorsichtig, wenn der String länger ist als das Pad. 

   let str = "a str"
   let padAmount = max(10, str.count)
   String(repeatElement("-", count: padAmount - str.count)) + str

Ausgabe "-----a str"

1
possen

Einzelheiten

Xcode 9.0.1, Swift 4.0

Lösungen

Daten

import Foundation

let array = [0,1,2,3,4,5,6,7,8]

Lösung 1

extension Int {

    func getString(prefix: Int) -> String {
        return "\(prefix)\(self)"
    }

    func getString(prefix: String) -> String {
        return "\(prefix)\(self)"
    }
}

for item in array {
    print(item.getString(prefix: 0))
}

for item in array {
    print(item.getString(prefix: "0x"))
}

Lösung 2

for item in array {
    print(String(repeatElement("0", count: 2)) + "\(item)")
}

Lösung 3

extension String {

    func repeate(count: Int, string: String? = nil) -> String {

        if count > 1 {
            let repeatedString = string ?? self
            return repeatedString + repeate(count: count-1, string: repeatedString)
        }
        return self
    }
}

for item in array {
    print("0".repeate(count: 3) + "\(item)")
}
0

Swift 5

@imanuo answers ist bereits großartig, aber wenn Sie mit einer Anwendung voller Zahlen arbeiten, können Sie eine Erweiterung wie diese in Betracht ziehen:

extension String {

    init(withInt int: Int, leadingZeros: Int = 2) {
        self.init(format: "%0\(leadingZeros)d", int)
    }

    func leadingZeros(_ zeros: Int) -> String {
        if let int = Int(self) {
            return String(withInt: int, leadingZeros: zeros)
        }
        print("Warning: \(self) is not an Int")
        return ""
    }

}

Auf diese Weise können Sie überall anrufen:

String(withInt: 3) 
// prints 03

String(withInt: 23, leadingZero: 4) 
// prints 0023

"54".leadingZeros(3)
// prints 54
0
Luca Davanzo