Swift中Int的前导零

Jee*_*hut 272 string int type-conversion swift

我想将IntSwift转换为String带有前导零的.例如,考虑以下代码:

for myInt in 1 ... 3 {
    print("\(myInt)")
}
Run Code Online (Sandbox Code Playgroud)

目前的结果是:

1
2
3
Run Code Online (Sandbox Code Playgroud)

但我希望它是:

01
02
03
Run Code Online (Sandbox Code Playgroud)

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

vac*_*ama 596

假设你想要一个带有前导零的字段长度为2,你可以这样做:

import Foundation

for myInt in 1 ... 3 {
    print(String(format: "%02d", myInt))
}
Run Code Online (Sandbox Code Playgroud)

输出:

01
02
03
Run Code Online (Sandbox Code Playgroud)

这在import Foundation技术上要求它不是Swift语言的一部分,而是Foundation框架提供的功能.请注意这两个import UIKitimport Cocoa包括Foundation所以它是没有必要的,如果你已导入再次导入CocoaUIKit.


格式字符串可以指定多个项目的格式.例如,如果您尝试格式化3小时,15分钟和7秒,03:15:07您可以这样做:

let hours = 3
let minutes = 15
let seconds = 7
print(String(format: "%02d:%02d:%02d", hours, minutes, seconds))
Run Code Online (Sandbox Code Playgroud)

输出:

03:15:07
Run Code Online (Sandbox Code Playgroud)

  • 嘿,直到你到达"10"才有用 (6认同)
  • `String(格式:"%03d",myInt)`会给你"000","001",......,"099","100". (6认同)
  • 尽管这不是Swift的一部分,但实际上看起来很干净。我认为还没有Swift本机的方法,所以这可能是目前最接近的方法。谢谢,vacawama。:) (2认同)

Ima*_*tit 132

使用Swift 4.2,您可以选择以下三个示例中的一个来解决您的问题.


#1.使用Stringinit(format:_:)初始化程序

Foundation为Swift String提供init(format:_:)初始化程序.init(format:_:)有以下声明:

init(format: String, _ arguments: CVarArg...)
Run Code Online (Sandbox Code Playgroud)

返回String通过使用给定格式字符串作为模板初始化的对象,其余的参数值将替换为该模板.

以下Playground代码显示如何使用以下内容创建具有至少两个整数位的String格式化:Intinit(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"
Run Code Online (Sandbox Code Playgroud)

#2.使用Stringinit(format:arguments:)初始化程序

Foundation为Swift String提供init(format:arguments:)初始化程序.init(format:arguments:)有以下声明:

init(format: String, arguments: [CVarArg])
Run Code Online (Sandbox Code Playgroud)

返回String通过使用给定格式字符串作为模板初始化的对象,其余的参数值将根据用户的默认语言环境替换到该模板中.

以下Playground代码显示如何使用以下内容创建具有至少两个整数位的String格式化:Intinit(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"
Run Code Online (Sandbox Code Playgroud)

#3.运用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")
Run Code Online (Sandbox Code Playgroud)


Kir*_*air 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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
    }
}
Run Code Online (Sandbox Code Playgroud)

使用此方法:

for myInt in 1...3 {
    print("\(myInt)".padLeft(totalWidth: 2, with: "0"))
}
Run Code Online (Sandbox Code Playgroud)


小智 7

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
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

let s = String(123)
s.leftPadding(toLength: 8, withPad: "0") // "00000123"
Run Code Online (Sandbox Code Playgroud)


mxc*_*xcl 7

使用 Swift 5\xe2\x80\x99s 奇特的新可扩展插值:

\n
extension DefaultStringInterpolation {\n    mutating func appendInterpolation(pad value: Int, toWidth width: Int, using paddingCharacter: Character = "0") {\n        appendInterpolation(String(format: "%\\(paddingCharacter)\\(width)d", value))\n    }\n}\n\nlet pieCount = 3\nprint("I ate \\(pad: pieCount, toWidth: 3, using: "0") pies")  // => `I ate 003 pies`\nprint("I ate \\(pad: 1205, toWidth: 3, using: "0") pies")  // => `I ate 1205 pies`\n
Run Code Online (Sandbox Code Playgroud)\n


Luc*_*nzo 5

斯威夫特 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 ""
    }
    
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以在任何地方调用:

String(withInt: 3) 
// prints 03

String(withInt: 23, leadingZeros: 4) 
// prints 0023

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

"54".leadingZeros(3)
// prints 054
Run Code Online (Sandbox Code Playgroud)