填充swift字符串进行打印

Dro*_*com 34 string padding swift

我正在尝试打印所有填充到相同宽度的字符串列表.

在C中,我会使用类似printf("%40s", cstr),cstr是C字符串的地方.

在Swift中,我能想到的最好的是:

line += String(format: "%40s",string.cStringUsingEncoding(<someEncoding>))
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法 ?

Gus*_*ler 65

Swift 3中,您可以使用:

let str = "Test string"
let paddedStr = str.padding(toLength: 20, withPad: " ", startingAt: 0)
Run Code Online (Sandbox Code Playgroud)

结果字符串: "Test string "

如果你需要在左边填充文本(右对齐),你可以编写以下函数作为扩展名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))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,如果你写:

let str = "Test string"
let paddedStr = str.leftPadding(toLength: 20, withPad: " ")
Run Code Online (Sandbox Code Playgroud)

结果字符串: " Test string"

Swift 4.1中,substring不推荐使用该方法,并且有许多新方法可以获取子字符串.要么prefix,suffix或下标来StringRange<String.Index>.

对于之前的扩展,我们可以使用该suffix方法来完成相同的结果.由于该suffix方法返回a String.SubSequence,因此需要String在返回之前将其转换为a .

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))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 编辑了 Swift 4 版本以反映字符属性的弃用。 (2认同)

Cod*_*ent 17

NSStringstringByPaddingToLength:方法:

line += string.padding(toLength: 40, withPad: " ", startingAt: 0)
Run Code Online (Sandbox Code Playgroud)

  • 要在左侧添加填充,我们必须编写自己的代码。, extension String { func PadLeft(totalWidth: Int,byString:String) -&gt; String { let toPad = totalWidth - self.characters.count; 如果 toPad &lt; 1 { 返回自身;} return "".stringByPaddingToLength(toPad, withString: byString, startingAtIndex: 0) + self; } } (3认同)

Leo*_*bus 9

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))
    }
}
Run Code Online (Sandbox Code Playgroud)
"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"
Run Code Online (Sandbox Code Playgroud)

为了复制相同的行为,padding(toLength:, withPad:, startingAt:)我们可以将rotateTo left 功能添加到RangeReplaceableCollection

extension RangeReplaceableCollection {
    func rotatingLeft(positions: Int) -> SubSequence {
        let index = self.index(startIndex, offsetBy: positions, limitedBy: endIndex) ?? endIndex
        return self[index...] + self[..<index]
    }
}
Run Code Online (Sandbox Code Playgroud)

并按如下方式实施:

extension RangeReplaceableCollection where Self: StringProtocol {
    func paddingToLeft<S: StringProtocol & RangeReplaceableCollection>(upTo length: Int, with string: S, startingAt index: Int = 0) -> SubSequence {
        let string = string.rotatingLeft(positions: index)
        return repeatElement(string, count: length-count/string.count)
            .joined().prefix(length-count) + suffix(Swift.max(count, count-length))
    }
}
Run Code Online (Sandbox Code Playgroud)
"123".paddingToLeft(upTo: 10, with: "abc", startingAt: 2)   //  "cabcabc123"
"123".padding(toLength: 10, withPad: "abc", startingAt: 2)  //  "123cabcabc"
Run Code Online (Sandbox Code Playgroud)


pac*_*ion 6

将所有字符串格式代码放入extension并在任何地方重用它.

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+++++++"
Run Code Online (Sandbox Code Playgroud)


Tom*_*m E 6

以下两个函数返回填充到给定宽度的字符串,左对齐或右对齐。它是纯 Swift 4,没有 NSString,也没有 C 字符串。您可以选择是否截断长于填充宽度的字符串。

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)
    }
}
Run Code Online (Sandbox Code Playgroud)


use*_*850 5

对于左侧填充,您可以使用双重反转技巧:

String(String(s.reversed()).padding(toLength: 5, withPad: "0", startingAt: 0).reversed())
Run Code Online (Sandbox Code Playgroud)

当然,你可以将其包装为扩展:

extension String {
    func leftPadding(toLength: Int, withPad: String) -> String {
        String(String(reversed()).padding(toLength: toLength, withPad: withPad, startingAt: 0).reversed())
    }
}
Run Code Online (Sandbox Code Playgroud)