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或下标来String用Range<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)
Cod*_*ent 17
NSString有stringByPaddingToLength:方法:
line += string.padding(toLength: 40, withPad: " ", startingAt: 0)
Run Code Online (Sandbox Code Playgroud)
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)
将所有字符串格式代码放入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)
以下两个函数返回填充到给定宽度的字符串,左对齐或右对齐。它是纯 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)
对于左侧填充,您可以使用双重反转技巧:
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)