我想将Swift中的Int
转换为带有前导零的String
。例如,请考虑以下代码:
for myInt in 1 ... 3 {
print("\(myInt)")
}
目前的结果是:
1
2
3
但我希望它是:
01
02
03
在Swift标准库中是否有一种干净的方法?
答案 0 :(得分:541)
假设您希望字段长度为2且前导零,则执行此操作:
import Foundation
for myInt in 1 ... 3 {
print(String(format: "%02d", myInt))
}
输出:
01 02 03
这需要import Foundation
所以从技术上讲它不是Swift语言的一部分,而是Foundation
框架提供的功能。请注意,import UIKit
和import Cocoa
都包含Foundation
,因此如果您已导入Cocoa
或{{1},则无需再次导入它}。
格式字符串可以指定多个项目的格式。例如,如果您尝试将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))
答案 1 :(得分:129)
使用Swift 4.2,您可以选择以下所示的三个示例之一来解决您的问题。
String
' init(format:_:)
初始值设定项 Foundation
为Swift String
提供init(format:_:)
初始值设定项。 init(format:_:)
有以下声明:
init(format: String, _ arguments: CVarArg...)
返回一个
String
对象,该对象使用给定的格式字符串作为模板进行初始化,其余的参数值将替换为该模板。
以下Playground代码显示了如何使用String
创建一个Int
格式为init(format:_:)
,其格式为至少两个整数位数:
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"
String
' init(format:arguments:)
初始值设定项 Foundation
为Swift String
提供init(format:arguments:)
初始值设定项。 init(format:arguments:)
有以下声明:
init(format: String, arguments: [CVarArg])
返回一个
String
对象,该对象使用给定的格式字符串作为模板初始化,其余的参数值将根据用户的默认语言环境替换。
以下Playground代码显示了如何使用String
创建一个Int
格式为init(format:arguments:)
,其格式为至少两个整数位数:
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"
NumberFormatter
基金会提供NumberFormatter
。 Apple说明了这一点:
NSNumberFormatter
实例格式化包含NSNumber
个对象的单元格的文本表示形式,并将数值的文本表示形式转换为NSNumber
个对象。表示包括整数,浮点数和双精度数;浮点数和双精度数可以格式化为指定的小数位。
以下Playground代码显示了如何创建NumberFormatter
从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")
答案 2 :(得分:11)
对于左边填充添加如下字符串扩展名:
Swift 2.0 +
extension String {
func padLeft (totalWidth: Int, with: String) -> String {
let toPad = totalWidth - self.characters.count
if toPad < 1 { return self }
return "".stringByPaddingToLength(toPad, withString: with, startingAtIndex: 0) + self
}
}
Swift 3.0 +
extension String {
func padLeft (totalWidth: Int, with: String) -> String {
let toPad = totalWidth - self.characters.count
if toPad < 1 { return self }
return "".padding(toLength: toPad, withPad: with, startingAt: 0) + self
}
}
使用此方法:
for myInt in 1...3 {
print("\(myInt)".padLeft(totalWidth: 2, with: "0"))
}
答案 3 :(得分:6)
Swift 3.0 +
左侧填充String
扩展名与padding(toLength:withPad:startingAt:)
Foundation
类似
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"
答案 4 :(得分:4)
使用 Swift 5 新奇的可扩展插值:
extension DefaultStringInterpolation {
mutating func appendInterpolation(pad value: Int, toWidth width: Int, using paddingCharacter: Character = "0") {
appendInterpolation(String(format: "%\(paddingCharacter)\(width)d", value))
}
}
let pieCount = 3
print("I ate \(pad: pieCount, toWidth: 3, using: "0") pies") // => `I ate 003 pies`
print("I ate \(pad: 1205, toWidth: 3, using: "0") pies") // => `I ate 1205 pies`
答案 5 :(得分:2)
在Xcode 8.3.2,iOS 10.3中 多数民众赞成现在很好
<强>的Sample1:强>
let dayMoveRaw = 5
let dayMove = String(format: "%02d", arguments: [dayMoveRaw])
print(dayMove) // 05
<强>样品2:强>
let dayMoveRaw = 55
let dayMove = String(format: "%02d", arguments: [dayMoveRaw])
print(dayMove) // 55
答案 6 :(得分:1)
如果您只使用格式字符串处理数字,那么其他答案都很好,但是当您可能需要填充字符串时这很好(虽然可以说比问题有点不同,但在精神上似乎相似) 。另外,如果弦长于垫,请小心。
let str = "a str"
let padAmount = max(10, str.count)
String(repeatElement("-", count: padAmount - str.count)) + str
输出"-----a str"
答案 7 :(得分:1)
@imanuo的答案已经很不错了,但是如果您正在使用数量众多的应用程序,则可以考虑使用以下扩展名:
extension String {
init(withInt int: Int, leadingZeros: Int = 2) {
self.init(format: "%0\(leadingZeros)d", int)
}
func leadingZeros(_ zeros: Int) -> String {
if let int = Int(self) {
return String(withInt: int, leadingZeros: zeros)
}
print("Warning: \(self) is not an Int")
return ""
}
}
通过这种方式,您可以在任何地方打电话:
String(withInt: 3)
// prints 03
String(withInt: 23, leadingZeros: 4)
// prints 0023
"54".leadingZeros(3)
// prints 54
答案 8 :(得分:0)
Xcode 9.0.1,swift 4.0
数据强>
import Foundation
let array = [0,1,2,3,4,5,6,7,8]
解决方案1
extension Int {
func getString(prefix: Int) -> String {
return "\(prefix)\(self)"
}
func getString(prefix: String) -> String {
return "\(prefix)\(self)"
}
}
for item in array {
print(item.getString(prefix: 0))
}
for item in array {
print(item.getString(prefix: "0x"))
}
解决方案2
for item in array {
print(String(repeatElement("0", count: 2)) + "\(item)")
}
解决方案3
extension String {
func repeate(count: Int, string: String? = nil) -> String {
if count > 1 {
let repeatedString = string ?? self
return repeatedString + repeate(count: count-1, string: repeatedString)
}
return self
}
}
for item in array {
print("0".repeate(count: 3) + "\(item)")
}
答案 9 :(得分:0)
Swift 4 *及更高版本,您还可以尝试以下操作:
func leftPadding(valueString: String, toLength: Int, withPad: String = " ") -> String {
guard toLength > valueString.count else { return valueString }
let padding = String(repeating: withPad, count: toLength - valueString.count)
return padding + valueString
}
调用函数:
leftPadding(valueString: "12", toLength: 5, withPad: "0")
输出: “ 00012”
答案 10 :(得分:-11)
与使用格式化程序的其他答案不同,您还可以添加&#34; 0&#34;循环内每个数字前面的文字,如下所示:
for myInt in 1...3 {
println("0" + "\(myInt)")
}
但是当你必须为每个单独的数字添加假定指定数量的0时,格式化程序通常会更好。如果你只需要添加一个0,那么它真的只是你的选择。