web-dev-qa-db-fra.com

Remplissage d'une chaîne Swift pour l'impression

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?

33
Droopycom

NSString a le stringByPaddingToLength: méthode:

line += string.stringByPaddingToLength(40, withString: " ", startingAtIndex: 0)
16
Code Different

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))
        }
    }
}
62
Gustavo Seidler

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+++++++"
6
pacification
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"
4
Leo Dabus

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)
    }
}
2
Tom E