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 UIKit
和import Cocoa
包含Foundation
所以如果您已经导入了Cocoa
或UIKit
,则不需要再导入它。
根据您的需要,使用Swift 3,您可以从以下三个示例中select一个。
#1。 使用String
的init(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。 使用String
的init(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。