web-dev-qa-db-ja.com

SwiftのIntの先行ゼロ

SwiftのIntを、先行ゼロ付きのStringに変換したいのですが。たとえば、次のコードを見てください。

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

現在の結果は次のとおりです。

1
2
3

しかし、私はそれがになりたい:

01
02
03

Swiftの標準ライブラリ内でこれを行うためのクリーンな方法はありますか?

247
Dschee

先行ゼロを含む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または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
553
vacawama

Swift 4.2では、問題を解決するために、以下に示す3つの例のいずれかを選択できます。


#1 Stringinit(format:_:)イニシャライザを使う

FoundationはSwiftのStringinit(format:_:)初期化子に提供します。 init(format:_:)は次のように宣言されています。

init(format: String, _ arguments: CVarArg...)

指定されたフォーマット文字列をテンプレートとして使用して初期化されたStringオブジェクトを返します。このテンプレートに残りの引数値が代入されます。

次のPlaygroundコードは、init(format:_:)を使用して、2桁以上の整数でStringからフォーマットされたIntを作成する方法を示しています。

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 Stringinit(format:arguments:)イニシャライザを使う

FoundationはSwiftのStringinit(format:arguments:)初期化子に提供します。 init(format:arguments:)は次のように宣言されています。

init(format: String, arguments: [CVarArg])

指定されたフォーマット文字列をテンプレートとして使用して初期化されたStringオブジェクトを返します。テンプレートの残りの引数値は、ユーザーのデフォルトロケールに従って置き換えられます。

次のPlaygroundコードは、init(format:arguments:)を使用して、2桁以上の整数でStringからフォーマットされたIntを作成する方法を示しています。

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 を提供しています。 Appleはそれについて次のように述べています。

NSNumberFormatterのインスタンスは、NSNumberオブジェクトを含むセルのテキスト表現をフォーマットし、数値のテキスト表現をNSNumberオブジェクトに変換します。表現は整数、浮動小数点数、倍精度を含みます。浮動小数点数と倍精度浮動小数点数は、指定された小数点以下の桁数にフォーマットできます。

次のPlaygroundコードは、2桁以上の整数で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")
129
Imanou Petit

左パディングのためにこのような文字列拡張子を追加します:

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"))
}
11
Kiran P Nair

Swift 3.0 +

Stringpadding(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"
6
John Cromie

xcode 8.3.2では、iOS 10.3 Thatsが今のところ良い

サンプル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
2
Steffen

あなたがフォーマット文字列を使っている数字だけを扱っているならば、他の答えは良いです、しかし、あなたがパディングされる必要がある文字列を持っているかもしれないとき、これは良いです。また、文字列がパッドより長い場合は注意してください。

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

"-----a str"を出力する

1
possen

詳細

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

スイフト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, leadingZero: 4) 
// prints 0023

"54".leadingZeros(3)
// prints 54
0
Luca Davanzo