J'essaie d'imprimer une liste de chaînes toutes rembourrées à la même largeur.
En C, j'utiliserais quelque chose comme printf("%40s", cstr),
où cstr est une chaîne C.
Dans Swift, le meilleur que j'ai pu trouver est le suivant:
line += String(format: "%40s",string.cStringUsingEncoding(<someEncoding>))
Y a-t-il une meilleure façon?
NSString
a le stringByPaddingToLength:
méthode:
line += string.stringByPaddingToLength(40, withString: " ", startingAtIndex: 0)
Dans Swift vous pouvez utiliser:
let str = "Test string"
let paddedStr = str.padding(toLength: 20, withPad: " ", startingAt: 0)
Chaîne de résultat: "Test string "
Si vous avez besoin de remplir à gauche le texte (justification à droite), vous pouvez écrire la fonction suivante comme une extension à String
:
extension String {
func leftPadding(toLength: Int, withPad character: Character) -> String {
let newLength = self.characters.count
if newLength < toLength {
return String(repeatElement(character, count: toLength - newLength)) + self
} else {
return self.substring(from: index(self.startIndex, offsetBy: newLength - toLength))
}
}
}
Donc, si vous écrivez:
let str = "Test string"
let paddedStr = str.leftPadding(toLength: 20, withPad: " ")
Chaîne de résultat: " Test string"
Dans Swift 4.1 la méthode substring
est déconseillée et il existe un certain nombre de nouvelles méthodes pour obtenir une sous-chaîne. Soit prefix
, suffix
soit en souscrivant le String
avec un Range<String.Index>
.
Pour l'extension précédente, nous pouvons utiliser la méthode suffix
pour obtenir le même résultat. Puisque la méthode suffix
renvoie un String.SubSequence
, il doit être converti en String
avant d'être renvoyé.
extension String {
func leftPadding(toLength: Int, withPad character: Character) -> String {
let stringLength = self.count
if stringLength < toLength {
return String(repeatElement(character, count: toLength - stringLength)) + self
} else {
return String(self.suffix(toLength))
}
}
}
Mettez tout le code de format de chaîne dans extension
et réutilisez-le où vous voulez.
extension String {
func padding(length: Int) -> String {
return self.stringByPaddingToLength(length, withString: " ", startingAtIndex: 0)
}
func padding(length: Int, paddingString: String) -> String {
return self.stringByPaddingToLength(length, withString: paddingString, startingAtIndex: 0)
}
}
var str = "str"
print(str.padding(10)) // "str "
print(str.padding(10, paddingString: "+")) // "str+++++++"
extension RangeReplaceableCollection where Self: StringProtocol {
func paddingToLeft(upTo length: Int, using element: Element = " ") -> SubSequence {
return repeatElement(element, count: Swift.max(0, length-count)) + suffix(Swift.max(count, count-length))
}
}
"123".paddingToLeft(upTo: 5) // " 123"
"123".paddingToLeft(upTo: 5, using: "0") // "00123"
"123".paddingToLeft(upTo: 3, using: "0") // "123"
"$199.99".dropLast(3).paddingToLeft(upTo: 10, using: "_") // "______$199"
Les deux fonctions suivantes renvoient une chaîne complétée à la largeur donnée, justifiée à gauche ou à droite. Il est pur Swift 4, pas de chaîne NSS, ni de chaîne C non plus. Vous pouvez choisir si une chaîne plus longue que la largeur de remplissage sera tronquée ou non.
extension String {
func rightJustified(width: Int, truncate: Bool = false) -> String {
guard width > count else {
return truncate ? String(suffix(width)) : self
}
return String(repeating: " ", count: width - count) + self
}
func leftJustified(width: Int, truncate: Bool = false) -> String {
guard width > count else {
return truncate ? String(prefix(width)) : self
}
return self + String(repeating: " ", count: width - count)
}
}