Swift에서 Int의 선행 0


305

IntSwift에서을 String선행 0 으로 변환하고 싶습니다 . 예를 들어 다음 코드를 고려하십시오.

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

현재 그 결과는 다음과 같습니다.

1
2
3

그러나 나는 그것이되기를 원합니다.

01
02
03

Swift 표준 라이브러리 내 에서이 작업을 수행하는 명확한 방법이 있습니까?

답변:


670

선행 0이있는 필드 길이 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이미 가져온 경우 다시 가져올 필요가 없습니다 그래서 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))

산출:

03:15:07

2
이것은 Swift의 일부는 아니지만 실제로 매우 깨끗해 보입니다. 나는 이것을하는 스위프트 고유의 방법이 없기 때문에 이것이 현재 가장 가깝다고 생각합니다. vacawama 감사합니다. :)
Jeehut

1
그건 그렇고 : 내가 숫자 앞에 하나의 0을 원한다면 나는 println("0\(myInt)")당신의 제안을 선택했을 것 입니다. NSString 형식화 대신 Swift 기본 문자열 클래스를 사용합니다.
Jeehut

6
"10"에 도달 할 때까지 유용합니다. hehe
Jose M Pan

7
String(format: "%03d", myInt)당신에게 줄 것이다 "000", "001", ... , "099", "100".
vacawama

1
이와 같은 값이 -3, -9발생하면 앞에 오는 0없이 동일한 값을 반환합니다.
Codetard

139

Swift 5를 사용하면 문제를 해결하기 위해 아래에 표시된 세 가지 예 중 하나를 선택할 수 있습니다 .


#1. 사용 Stringinit(format:_:)이니셜 라이저

FoundationSwift Stringinit(format:_:)이니셜 라이저를 제공합니다 . init(format:_:)다음과 같은 선언이 있습니다.

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

String주어진 형식 문자열을 나머지 인수 값이 대체되는 템플릿으로 사용하여 초기화 된 객체를 반환합니다 .

다음 놀이터 코드는 다음 을 사용하여 2 자리 이상의 정수로 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"

# 2. 사용 Stringinit(format:arguments:)이니셜 라이저

FoundationSwift Stringinit(format:arguments:)이니셜 라이저를 제공합니다 . init(format:arguments:)다음과 같은 선언이 있습니다.

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

String주어진 형식 문자열을 템플릿으로 사용하여 나머지 인수 값이 사용자의 기본 로캘에 따라 대체되어 초기화 된 객체를 반환합니다 .

다음 놀이터 코드는 다음 을 사용하여 2 자리 이상의 정수로 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"

#삼. 사용NumberFormatter

재단이 제공합니다 NumberFormatter. 애플은 이에 대해 언급했다.

개체 NSNumberFormatter를 포함 NSNumber하고 숫자 값의 텍스트 표현을 개체로 변환 하는 셀의 텍스트 표현 형식의 인스턴스입니다 NSNumber. 표현은 정수, 부동 수 및 복식을 포함합니다. float 및 double은 지정된 소수점 위치로 형식을 지정할 수 있습니다.

만드는 방법 다음 놀이터 코드 쇼 NumberFormatter가 반환 String?A로부터 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")

여러 곳에서 같은 방식으로 숫자를 형식화하려고하면 대답이 옳다고 생각합니다. 요청하지 않았으므로 vacawama의 답변을 올바른 것으로 선택했습니다. 그러나 답변 주셔서 감사합니다! :)
Jeehut

@ImanouPetit. 참고로, 나는 이것을 최소 숫자 3으로 사용했습니다. 명시 적으로 랩을 풀지 않으면 즉, formatNumber = formatter.stringFromNumber (counter)! 문자열에는 Optional ( "001")이 포함되어 있으므로 이미지 경로를 동적으로 선택하는 코드가 실패합니다. '!'으로
래핑 해제

11

왼쪽 여백의 경우 다음과 같이 문자열 확장을 추가하십시오.

스위프트 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
    }
}

스위프트 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"))
}

1
왜?! 이것의 장점은 무엇입니까?
Mike Glukhov

7

스위프트 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"

1
withPad전달 된 인수가 단일 문자 이상인 경우 사용자가 예상 한대로 작동하거나 작동하지 않을 수 있습니다 .
nhgrif

4

스위프트 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

확장 FTW .. !! 이것은 Swift 4에서도 잘 작동했습니다. 이전 코드를 3에서 4로, 결국 Swift 5로 옮기는 데 어려움을 겪고있는 사람들을 위해 ... :)
Nick N

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

1

다른 답변은 형식 문자열을 사용하여 숫자 만 처리하는 경우 유용하지만 패딩 해야하는 문자열이있을 때 좋습니다 (질문과는 약간 다르지만 정신적으로 비슷합니다). 또한 줄이 패드보다 길면주의하십시오.

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

산출 "-----a str"


0

세부

Xcode 9.0.1, 신속한 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)")
}

repeatElement 접근 방식과 마찬가지로 패딩 문자열에 대한 내 대답을 참조하십시오.
possen

두 자리 정수 (예 : 10이 010이 됨)에는 작동하지 않습니다. 또한 원래의 질문은 표준 라이브러리와 관련된 솔루션에 대해 특별히 물었습니다. @ImanouPetit의 위의 답변이 선호됩니다.
cleverbit

-12

포맷터를 사용하는 다른 답변과 달리 루프 내부의 각 숫자 앞에 "0"텍스트를 다음과 같이 추가 할 수도 있습니다.

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

그러나 각 개별 숫자에 대해 지정된 양의 0을 가정해야하는 경우 포맷터가 더 나은 경우가 많습니다. 그래도 0을 하나만 추가하면 실제로 선택입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.