我想将Swift中的Int转换为带前导零的字符串。例如,考虑以下代码:

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

目前的结果是:

1
2
3

但我希望它是:

01
02
03

在Swift标准库中是否有一种干净的方式来做到这一点?


当前回答

斯威夫特5

@imanuo answers已经很棒了,但如果你正在使用一个充满数字的应用程序,你可以考虑这样的扩展:

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

"42".leadingZeros(2)
// prints 42

"54".leadingZeros(3)
// prints 054

其他回答

使用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`

使用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的3位字符串:

import Foundation

var randomInt = Int.random(in: 0..<1000)
var str = String(randomInt)
var paddingZero = String(repeating: "0", count: 3 - str.count)

print(str, str.count, paddingZero + str)

输出:

5 1 005
88 2 088
647 3 647

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”

斯威夫特5

@imanuo answers已经很棒了,但如果你正在使用一个充满数字的应用程序,你可以考虑这样的扩展:

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

"42".leadingZeros(2)
// prints 42

"54".leadingZeros(3)
// prints 054