我想将Swift中的Int转换为带前导零的字符串。例如,考虑以下代码:
for myInt in 1 ... 3 {
print("\(myInt)")
}
目前的结果是:
1
2
3
但我希望它是:
01
02
03
在Swift标准库中是否有一种干净的方式来做到这一点?
我想将Swift中的Int转换为带前导零的字符串。例如,考虑以下代码:
for myInt in 1 ... 3 {
print("\(myInt)")
}
目前的结果是:
1
2
3
但我希望它是:
01
02
03
在Swift标准库中是否有一种干净的方式来做到这一点?
当前回答
对于左填充,添加一个字符串扩展,如下所示:
Swift 5.0 +
extension String {
func padLeft(totalWidth: Int, with byString: String) -> String {
let toPad = totalWidth - self.count
if toPad < 1 {
return self
}
return "".padding(toLength: toPad, withPad: byString, startingAt: 0) + self
}
}
使用这种方法:
for myInt in 1...3 {
print("\(myInt)".padLeft(totalWidth: 2, with: "0"))
}
其他回答
假设你想要一个长度为2且前导为0的字段,你可以这样做:
import Foundation
for myInt in 1 ... 3 {
print(String(format: "%02d", myInt))
}
输出:
01 02 03
这需要导入Foundation,所以从技术上讲,它不是Swift语言的一部分,而是Foundation框架提供的功能。请注意,import UIKit和import Cocoa都包含Foundation,所以如果你已经导入了Cocoa或UIKit,就没有必要再次导入它。
格式字符串可以指定多个项的格式。例如,如果你想把3小时15分7秒格式化为03:15:07,你可以这样做:
let hours = 3
let minutes = 15
let seconds = 7
print(String(format: "%02d:%02d:%02d", hours, minutes, seconds))
输出:
03:15:07
如果您只使用格式字符串处理数字,那么其他答案都很好,但是当您可能有需要填充的字符串时,这个答案也很好(尽管不可否认与所问的问题略有不同,但在精神上似乎是相似的)。此外,如果弦比衬垫长,要小心。
let str = "a str"
let padAmount = max(10, str.count)
String(repeatElement("-", count: padAmount - str.count)) + str
输出“-----a str”
使用Swift 5,你可以从下面三个例子中选择一个来解决你的问题。
1。使用字符串init(格式:_)初始化
Foundation为Swift String提供了一个init(格式:_:)初始化器。Init(格式:_:)有以下声明:
init(format: String, _ arguments: CVarArg...)
返回使用给定格式字符串作为模板初始化的String对象,其余参数值被替换到模板中。
下面的Playground代码展示了如何使用init(format:_:)从Int创建一个至少有两个整型数字的String:
import Foundation
let string0 = String(format: "%02d", 0) // returns "00"
let string1 = String(format: "%02d", 1) // returns "01"
let string2 = String(format: "%02d", 10) // returns "10"
let string3 = String(format: "%02d", 100) // returns "100"
# 2。使用String的init(format:arguments:)初始化式
Foundation为Swift String提供了一个init(format:arguments:)初始化器。Init (format:arguments:)有以下声明:
init(format: String, arguments: [CVarArg])
返回一个String对象,初始化时使用给定格式字符串作为模板,其余参数值根据用户的默认地区替换。
下面的Playground代码展示了如何使用init(format:arguments:)从Int创建一个至少有两个整型数字的String:
import Foundation
let string0 = String(format: "%02d", arguments: [0]) // returns "00"
let string1 = String(format: "%02d", arguments: [1]) // returns "01"
let string2 = String(format: "%02d", arguments: [10]) // returns "10"
let string3 = String(format: "%02d", arguments: [100]) // returns "100"
# 3。使用NumberFormatter
Foundation提供了NumberFormatter。苹果对此表示:
NSNumberFormatter实例格式化包含NSNumber对象的单元格的文本表示,并将数值的文本表示转换为NSNumber对象。该表示包括整数、浮点数和双精度浮点数;浮点数和双精度数可以格式化为指定的小数位置。
下面的Playground代码展示了如何创建一个返回String?至少有两个整型数字的Int:
import Foundation
let formatter = NumberFormatter()
formatter.minimumIntegerDigits = 2
let optionalString0 = formatter.string(from: 0) // returns Optional("00")
let optionalString1 = formatter.string(from: 1) // returns Optional("01")
let optionalString2 = formatter.string(from: 10) // returns Optional("10")
let optionalString3 = formatter.string(from: 100) // returns Optional("100")
与其他使用格式化器的答案不同,你也可以在循环内的每个数字前面添加一个“0”文本,就像这样:
for myInt in 1...3 {
println("0" + "\(myInt)")
}
但是,当您必须为每个单独的数字添加指定数量的0时,formatter通常更好。如果你只需要加一个0,那么它就是你的选择。
Swift 3.0 +
左填充字符串扩展,类似于填充(toLength:withPad:startingAt:)在基础
extension String {
func leftPadding(toLength: Int, withPad: String = " ") -> String {
guard toLength > self.characters.count else { return self }
let padding = String(repeating: withPad, count: toLength - self.characters.count)
return padding + self
}
}
用法:
let s = String(123)
s.leftPadding(toLength: 8, withPad: "0") // "00000123"