Je voudrais convertir un Int
en Swift en Ssortingng
avec des zéros en tête. Par exemple, considérez ce code:
for myInt in 1...3 { print("\(myInt)") }
Actuellement, le résultat est le suivant:
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 vouliez une longueur de champ de 2 avec des zéros en tête, vous feriez ceci:
import Foundation for myInt in 1...3 { print(Ssortingng(format: "%02d", myInt)) }
sortie:
01 02 03
Cela nécessite d’ import Foundation
tellement que techniquement, cela ne fait pas partie du langage Swift mais une fonctionnalité fournie par le framework Foundation
. Notez que les deux import UIKit
et import Cocoa
include 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 ceci:
let hours = 3 let minutes = 15 let seconds = 7 print(Ssortingng(format: "%02d:%02d:%02d", hours, minutes, seconds))
sortie:
03:15:07
Avec Swift 4, vous pouvez choisir l’un des trois exemples ci-dessous pour résoudre votre problème.
init(format:_:)
Ssortingng
init(format:_:)
initialiseur Foundation
fournit à Swift Ssortingng
un init(format:_:)
. init(format:_:)
a la déclaration suivante:
init(format: Ssortingng, _ arguments: CVarArg...)
Renvoie un object
Ssortingng
initialisé en utilisant une chaîne de format donnée en tant que modèle dans lequel les valeurs d’argument restantes sont substituées.
Le code Playground suivant montre comment créer une Ssortingng
format Int
avec au moins deux chiffres entiers en utilisant init(format:_:)
:
import Foundation let ssortingng0 = Ssortingng(format: "%02d", 0) // returns "00" let ssortingng1 = Ssortingng(format: "%02d", 1) // returns "01" let ssortingng2 = Ssortingng(format: "%02d", 10) // returns "10" let ssortingng3 = Ssortingng(format: "%02d", 100) // returns "100"
init(format:arguments:)
Ssortingng
init(format:arguments:)
initialiseur Foundation
fournit à Swift Ssortingng
une init(format:arguments:)
. init(format:arguments:)
a la déclaration suivante:
init(format: Ssortingng, arguments: [CVarArg])
Renvoie un object
Ssortingng
initialisé à l’aide d’une chaîne de format donnée en tant que modèle dans lequel les valeurs d’argument restantes sont remplacées en fonction des parameters régionaux par défaut de l’utilisateur.
Le code Playground suivant montre comment créer une Ssortingng
formatée à partir d’ Int
avec au moins deux chiffres entiers en utilisant init(format:arguments:)
:
import Foundation let ssortingng0 = Ssortingng(format: "%02d", arguments: [0]) // returns "00" let ssortingng1 = Ssortingng(format: "%02d", arguments: [1]) // returns "01" let ssortingng2 = Ssortingng(format: "%02d", arguments: [10]) // returns "10" let ssortingng3 = Ssortingng(format: "%02d", arguments: [100]) // returns "100"
NumberFormatter
Foundation fournit NumberFormatter
. Apple en parle:
Les instances de
NSNumberFormatter
la représentation textuelle des cellules qui contiennent des objectsNSNumber
et convertissent les représentations textuelles de valeurs numériques en objectsNSNumber
. La représentation englobe les entiers, les flottants et les doubles; flottants et doubles peuvent être formatés à une position décimale spécifiée.
Le code Playground suivant montre comment créer un NumberFormatter
qui renvoie Ssortingng?
à partir d’un Int
avec au moins deux chiffres entiers:
import Foundation let formatter = NumberFormatter() formatter.minimumIntegerDigits = 2 let optionalSsortingng0 = formatter.ssortingng(from: 0) // returns Optional("00") let optionalSsortingng1 = formatter.ssortingng(from: 1) // returns Optional("01") let optionalSsortingng2 = formatter.ssortingng(from: 10) // returns Optional("10") let optionalSsortingng3 = formatter.ssortingng(from: 100) // returns Optional("100")
Pour le remplissage à gauche, ajoutez une extension de chaîne comme ceci:
Swift 2.0 +
extension Ssortingng { func padLeft (totalWidth: Int, with: Ssortingng) -> Ssortingng { let toPad = totalWidth - self.characters.count if toPad < 1 { return self } return "".stringByPaddingToLength(toPad, withString: with, startingAtIndex: 0) + self } }
Swift 3.0 +
extension Ssortingng { func padLeft (totalWidth: Int, with: Ssortingng) -> Ssortingng { 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 Extension de Ssortingng
similaire à padding(toLength:withPad:startingAt:)
dans Foundation
extension Ssortingng { func leftPadding(toLength: Int, withPad: Ssortingng = " ") -> Ssortingng { guard toLength > self.characters.count else { return self } let padding = Ssortingng(repeating: withPad, count: toLength - self.characters.count) return padding + self } }
Usage:
let s = Ssortingng(123) s.leftPadding(toLength: 8, withPad: "0") // "00000123"
dans Xcode 8.3.2, iOS 10.3
Échantillon1:
let dayMoveRaw = 5 let dayMove = Ssortingng(format: "%02d", arguments: [dayMoveRaw]) print(dayMove) // 05
Échantillon2:
let dayMoveRaw = 55 let dayMove = Ssortingng(format: "%02d", arguments: [dayMoveRaw]) print(dayMove) // 55
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 getSsortingng(prefix: Int) -> Ssortingng { return "\(prefix)\(self)" } func getSsortingng(prefix: Ssortingng) -> Ssortingng { return "\(prefix)\(self)" } } for item in array { print(item.getSsortingng(prefix: 0)) } for item in array { print(item.getSsortingng(prefix: "0x")) }
Solution 2
for item in array { print(Ssortingng(repeatElement("0", count: 2)) + "\(item)") }
Solution 3
extension Ssortingng { func repeate(count: Int, ssortingng: Ssortingng? = nil) -> Ssortingng { if count > 1 { let repeatedSsortingng = ssortingng ?? self return repeatedSsortingng + repeate(count: count-1, ssortingng: repeatedSsortingng) } return self } } for item in array { print("0".repeate(count: 3) + "\(item)") }
Les autres réponses sont bonnes si vous ne traitez que des nombres utilisant la chaîne de format, mais c’est bien quand vous avez des chaînes devant être complétées (bien que certes un peu différentes de la question posée, cela semble similaire). Aussi, soyez prudent si la chaîne est plus longue que le pad.
let str = "a str" let padAmount = max(10, str.count) Ssortingng(repeatElement("-", count: padAmount - str.count)) + str
Sortie "-----a str"
Contrairement aux autres réponses qui utilisent un formateur, vous pouvez également append un texte “0” devant chaque numéro à l’intérieur de la boucle, comme ceci:
for myInt in 1...3 { println("0" + "\(myInt)") }
Mais le formateur est souvent préférable lorsque vous devez append une quantité de 0 désignée pour chaque numéro distinct. Si vous avez seulement besoin d’en append un, alors c’est vraiment votre choix.