J'aimerais convertir une Int
dans Swift en une String
avec zéros non significatifs. Par exemple, considérons ce code:
for myInt in 1...3 {
print("\(myInt)")
}
Actuellement, le résultat est:
1
2
3
Mais je veux que ce soit:
01
02
03
Existe-t-il un moyen propre de le faire dans les bibliothèques standard Swift?
En supposant que vous souhaitiez une longueur de champ de 2 avec des zéros non significatifs, procédez comme suit:
import Foundation
for myInt in 1...3 {
print(String(format: "%02d", myInt))
}
sortie:
01 02 03
Ceci nécessite import Foundation
, donc techniquement, il ne fait pas partie de la langue Swift, mais une fonctionnalité fournie par le cadre Foundation
. Notez que import UIKit
et import Cocoa
incluent Foundation
. Il n'est donc pas nécessaire de l'importer à nouveau si vous avez déjà importé Cocoa
ou UIKit
.
La chaîne de format peut spécifier le format de plusieurs éléments. Par exemple, si vous essayez de formater 3
heures, 15
minutes et 7
secondes en 03:15:07
, vous pouvez le faire comme suit:
let hours = 3
let minutes = 15
let seconds = 7
print(String(format: "%02d:%02d:%02d", hours, minutes, seconds))
sortie:
03:15:07
Avec Swift 4.2, vous pouvez choisir l’un des trois exemples ci-dessous pour résoudre votre problème.
String
's init(format:_:)
Foundation
fournit à Swift String
un initialiseur init(format:_:)
. init(format:_:)
a la déclaration suivante:
init(format: String, _ arguments: CVarArg...)
Renvoie un objet
String
initialisé à l'aide d'une chaîne de format donnée en tant que modèle dans lequel les valeurs d'argument restantes sont substituées.
Le code de terrain de jeu suivant montre comment créer une String
formatée à partir de Int
avec au moins deux chiffres entiers à l'aide de 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
's init(format:arguments:)
Foundation
fournit à Swift String
un initialiseur init(format:arguments:)
. init(format:arguments:)
a la déclaration suivante:
init(format: String, arguments: [CVarArg])
Renvoie un objet
String
initialisé à l'aide d'une chaîne de format donnée en tant que modèle dans lequel les valeurs d'argument restantes sont substituées en fonction des paramètres régionaux par défaut de l'utilisateur.
Le code de terrain de jeu suivant montre comment créer une String
formatée à partir de Int
avec au moins deux chiffres entiers à l'aide de 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
La fondation fournit NumberFormatter
. Apple en parle:
Les instances de
NSNumberFormatter
mettent en forme la représentation textuelle de cellules contenant des objetsNSNumber
et convertissent les représentations textuelles de valeurs numériques en objetsNSNumber
. La représentation comprend des entiers, des flottants et des doubles; les flottants et les doubles peuvent être formatés à une position décimale spécifiée.
Le code de terrain de jeu suivant montre comment créer une NumberFormatter
qui renvoie String?
à partir d'une Int
avec au moins deux chiffres entiers:
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")
Pour un remplissage à gauche, ajoutez une extension de chaîne comme ceci:
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
}
}
En utilisant cette méthode:
for myInt in 1...3 {
print("\(myInt)".padLeft(totalWidth: 2, with: "0"))
}
Swift 3.0+
Rembourrage gauche String
extension semblable à padding(toLength:withPad:startingAt:)
dans 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
}
}
Usage:
let s = String(123)
s.leftPadding(toLength: 8, withPad: "0") // "00000123"
dans Xcode 8.3.2, iOS 10.3 C'est bon à maintenant
Sample1:
let dayMoveRaw = 5
let dayMove = String(format: "%02d", arguments: [dayMoveRaw])
print(dayMove) // 05
Sample2:
let dayMoveRaw = 55
let dayMove = String(format: "%02d", arguments: [dayMoveRaw])
print(dayMove) // 55
Les autres réponses sont bonnes si vous ne traitez que des nombres utilisant la chaîne de format, mais c'est utile lorsque vous pouvez avoir des chaînes qui doivent être complétées (bien qu'il soit vrai qu'un peu différent de la question posée, son esprit soit similaire). Aussi, soyez prudent si la chaîne est plus longue que le pad.
let str = "a str"
let padAmount = max(10, str.count)
String(repeatElement("-", count: padAmount - str.count)) + str
"-----a str"
de sortie
Xcode 9.0.1, Swift 4.0
Les données
import Foundation
let array = [0,1,2,3,4,5,6,7,8]
Solution 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"))
}
Solution 2
for item in array {
print(String(repeatElement("0", count: 2)) + "\(item)")
}
Solution 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)")
}
@imanuo répond est déjà une bonne chose, mais si vous travaillez avec une application pleine de nombre, vous pouvez envisager une extension comme celle-ci:
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 ""
}
}
De cette façon, vous pouvez appeler n'importe où:
String(withInt: 3)
// prints 03
String(withInt: 23, leadingZero: 4)
// prints 0023
"54".leadingZeros(3)
// prints 54