Risposte:
Supponendo che tu voglia una lunghezza del campo di 2 con zeri iniziali, dovresti farlo:
import Foundation
for myInt in 1 ... 3 {
print(String(format: "%02d", myInt))
}
produzione:
01 02 03
Ciò richiede import Foundation
tecnicamente che non fa parte del linguaggio Swift ma una funzionalità fornita dal Foundation
framework. Nota che entrambi import UIKit
e import Cocoa
includi Foundation
quindi non è necessario importarlo di nuovo se hai già importato Cocoa
o UIKit
.
La stringa di formato può specificare il formato di più elementi. Ad esempio, se stai cercando di formattare 3
ore, 15
minuti e 7
secondi, 03:15:07
potresti farlo in questo modo:
let hours = 3
let minutes = 15
let seconds = 7
print(String(format: "%02d:%02d:%02d", hours, minutes, seconds))
produzione:
03:15:07
println("0\(myInt)")
il tuo suggerimento. Questo userebbe la classe String nativa di Swift invece di passare attraverso la formattazione NSString.
String(format: "%03d", myInt)
ti darà "000", "001", ... , "099", "100"
.
-3, -9
verifica un valore simile , restituisce comunque lo stesso senza zero iniziale.
Con Swift 5, puoi scegliere uno dei tre esempi mostrati di seguito per risolvere il tuo problema.
String
l' init(format:_:)
inizializzatoreFoundation
fornisce a Swift String
un init(format:_:)
inizializzatore. init(format:_:)
ha la seguente dichiarazione:
init(format: String, _ arguments: CVarArg...)
Restituisce un
String
oggetto inizializzato utilizzando una determinata stringa di formato come modello in cui vengono sostituiti i valori degli argomenti rimanenti.
Il seguente codice Playground mostra come creare un String
formato da Int
almeno due cifre intere usando init(format:_:)
:
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"
String
l' init(format:arguments:)
inizializzatoreFoundation
fornisce a Swift String
un init(format:arguments:)
inizializzatore. init(format:arguments:)
ha la seguente dichiarazione:
init(format: String, arguments: [CVarArg])
Restituisce un
String
oggetto inizializzato utilizzando una determinata stringa di formato come modello in cui i valori degli argomenti rimanenti vengono sostituiti in base alle impostazioni internazionali predefinite dell'utente.
Il seguente codice Playground mostra come creare un String
formato da Int
almeno due cifre intere usando init(format:arguments:)
:
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"
NumberFormatter
Fondazione fornisce NumberFormatter
. Apple afferma al riguardo:
Istanze di
NSNumberFormatter
formattazione della rappresentazione testuale di celle che contengonoNSNumber
oggetti e conversione di rappresentazioni testuali di valori numerici inNSNumber
oggetti. La rappresentazione comprende numeri interi, float e doppi; float e doppi possono essere formattati in una posizione decimale specificata.
Il seguente codice Playground mostra come creare un NumberFormatter
che ritorni String?
da a Int
con almeno due cifre intere:
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")
Per il padding sinistro aggiungi un'estensione di stringa come questa:
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
}
}
Utilizzando questo metodo:
for myInt in 1...3 {
print("\(myInt)".padLeft(totalWidth: 2, with: "0"))
}
Swift 3.0+
String
Estensione imbottitura sinistra simile a padding(toLength:withPad:startingAt:)
inFoundation
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
}
}
Uso:
let s = String(123)
s.leftPadding(toLength: 8, withPad: "0") // "00000123"
withPad
argomento passato è più di un singolo carattere.
@imanuo risponde è già eccezionale, ma se stai lavorando con un'applicazione piena di numeri, puoi considerare un'estensione come questa:
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 ""
}
}
In questo modo puoi chiamare ovunque:
String(withInt: 3)
// prints 03
String(withInt: 23, leadingZeros: 4)
// prints 0023
"42".leadingZeros(2)
// prints 42
"54".leadingZeros(3)
// prints 054
Le altre risposte sono buone se hai a che fare solo con numeri che usano la stringa di formato, ma questo è utile quando potresti avere stringhe che devono essere riempite (anche se è vero che sono leggermente diverse dalla domanda posta, sembrano simili nello spirito). Inoltre, fai attenzione se la stringa è più lunga del pad.
let str = "a str"
let padAmount = max(10, str.count)
String(repeatElement("-", count: padAmount - str.count)) + str
Produzione "-----a str"
Xcode 9.0.1, rapido 4.0
Dati
import Foundation
let array = [0,1,2,3,4,5,6,7,8]
Soluzione 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"))
}
Soluzione 2
for item in array {
print(String(repeatElement("0", count: 2)) + "\(item)")
}
Soluzione 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)")
}
A differenza delle altre risposte che usano un formattatore, puoi anche aggiungere un testo "0" davanti a ciascun numero all'interno del ciclo, in questo modo:
for myInt in 1...3 {
println("0" + "\(myInt)")
}
Ma il formatter è spesso migliore quando devi aggiungere supponiamo che un numero designato di 0s per ogni numero separato. Se hai solo bisogno di aggiungere uno 0, però, è davvero solo la tua scelta.