Swift 中 Int 的前导零

问题描述 投票:0回答:12

我想将 Swift 中的

Int
转换为带有前导零的
String
。例如考虑这段代码:

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

目前的结果是:

1
2
3

但我希望它是:

01
02
03

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

string swift int type-conversion
12个回答
856
投票

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

import Foundation

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

输出:

01
02
03

这需要

import Foundation
,所以从技术上讲,它不是Swift语言的一部分,而是
Foundation
框架提供的能力。请注意,
import UIKit
import Cocoa
都包含
Foundation
,因此如果您已经导入了
Cocoa
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))

输出:

03:15:07

183
投票

使用 Swift 5,您可以选择下面显示的三个示例之一来解决您的问题。


#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 代码展示了如何创建一个

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

19
投票

对于左填充添加这样的字符串扩展:

extension String {

    func padLeft(totalWidth: Int, with byString: String) -> String {
        let toPad = totalWidth - self.count
        if toPad < 1 {
            return self
        }
    
        return "".padding(toLength: toPad, withPad: byString, startingAt: 0) + self
    }
}

使用这个方法:

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

9
投票

斯威夫特 3.0+

Left padding

String
extension 类似于
padding(toLength:withPad:startingAt:)
in
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"

7
投票

斯威夫特 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

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

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

6
投票

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

3
投票

在 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

3
投票

如果您只处理使用格式字符串的数字,其他答案很好,但是当您可能有需要填充的字符串时,这是很好的(尽管诚然与所问的问题有点不同,但在精神上似乎相似)。另外,如果琴弦比打击垫长,请小心。

   let str = "a str"
   let padAmount = max(10, str.count)
   String(repeatElement("-", count: padAmount - str.count)) + str

输出

"-----a str"


3
投票

下面的代码生成一个前面有 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

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

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”


-12
投票

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

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

但是当您必须为每个单独的数字添加假设指定数量的 0 时,格式化程序通常会更好。不过,如果你只需要加一个 0,那么它真的只是你的选择。

© www.soinside.com 2019 - 2024. All rights reserved.