Swift中Int的前导零

时间:2014-08-29 10:36:36

标签: string swift int type-conversion

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

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

目前的结果是:

1
2
3

但我希望它是:

01
02
03

在Swift标准库中是否有一种干净的方法?

11 个答案:

答案 0 :(得分:541)

假设您希望字段长度为2且前导零,则执行此操作:

import Foundation

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

输出:

01
02
03

这需要import Foundation所以从技术上讲它不是Swift语言的一部分,而是Foundation框架提供的功能。请注意,import UIKitimport 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,您可以选择以下所示的三个示例之一来解决您的问题。


#1。使用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"

#2。使用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"

#3。使用NumberFormatter

基金会提供NumberFormatter。 Apple说明了这一点:

  

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

以下Playground代码显示了如何创建NumberFormatterString?返回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)

雨燕5

@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,那么它真的只是你的选择。