Swift中Int的前导零

我想在Swift中将Int转换为带前导零的String 。 例如考虑这个代码:

 for myInt in 1...3 { print("\(myInt)") } 

目前的结果是:

 1 2 3 

但我希望它是:

 01 02 03 

在Swift标准库中有没有干净的方法?

假设你想要领先的零的字段长度为2,你可以这样做:

 import Foundation for myInt in 1...3 { print(String(format: "%02d", myInt)) } 

这需要import Foundation所以在技术上它不是Swift语言的一部分,而是Foundation框架提供的一种function。 请注意, import UIKitimport Cocoa包含Foundation所以如果您已经导入了CocoaUIKit ,则不需要再导入它。

根据您的需要,使用Swift 3,您可以从以下三个示例中select一个。


#1。 使用Stringinit(format:_:)初始值设定项

Foundation为Swift String提供了一个init(format:_:)初始值设定项。 init(format:_:)具有以下声明:

 init(format: String, _ arguments: CVarArg...) 

返回一个String对象,它使用给定的格式string作为模板,其余的参数值被replace。

以下Playground代码显示了如何使用init(format:_:)创build一个从Int格式化为至less包含两个整数数字的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。 使用Stringinit(format:arguments:)初始值设定项

Foundation为Swift String提供了一个init(format:arguments:)初始值设定项。 init(format:arguments:)具有以下声明:

 init(format: String, arguments: [CVarArg]) 

返回通过使用给定的格式string作为模板初始化的String对象,根据用户的默认语言环境将其余参数值replace为该模板。

以下Playground代码显示了如何使用init(format:arguments:)创build一个由Int格式化并至less包含两个整数数字的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

基础提供NumberFormatter 。 苹果表示:

NSNumberFormatter实例格式化包含NSNumber对象的单元格的文本表示forms,并将数字值的文本表示forms转换为NSNumber对象。 该表示包含整数,浮点数和双精度; 浮动和双打可以格式化到指定的小数位。

以下Playground代码显示如何创build一个返回String?NumberFormatter String? 从一个至less有两个整数的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") 

为左填充添加一个像这样的string扩展名:

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") } 

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" 

在Xcode 8.3.2,iOS 10.3这是很好的现在

样本1:

 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 

细节

xCode 9.0.1,swift 4.0

解决scheme

数据

 import Foundation let array = [0,1,2,3,4,5,6,7,8] 

解决scheme1

 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")) } 

解决scheme2

 for item in array { print(String(repeatElement("0", count: 2)) + "\(item)") } 

解决scheme3

 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)") } 

与使用格式化程序的其他答案不同,您也可以在循环内的每个数字前面添加一个“0”文本,如下所示:

 for myInt in 1...3 { println("0" + "\(myInt)") } 

但格式化程序往往更好,当你不得不添加为每个单独的数字指定数量的0。 如果你只需要添加一个0,那么这真的只是你的select。