Swift의 Int 선행 0
변환하고 싶습니다.Int
잽싸이String
선두에 0을 붙입니다.예를 들어 다음 코드를 생각해 보겠습니다.
for myInt in 1 ... 3 {
print("\(myInt)")
}
현재 그 결과는 다음과 같습니다.
1
2
3
하지만 난 이렇게 되길 바란다:
01
02
03
Swift 표준 라이브러리 내에서 이를 수행할 수 있는 깨끗한 방법이 있습니까?
필드 길이가 2이고 선행 0이 필요한 경우 다음을 수행합니다.
import Foundation
for myInt in 1 ... 3 {
print(String(format: "%02d", myInt))
}
출력:
01 02 03
이 경우import Foundation
그래서 엄밀히 말하면 그것은 스위프트 언어의 일부가 아니라 Swift에 의해 제공되는 기능이다.Foundation
를 참조할 수 있습니다.주의: 둘 다import UIKit
그리고.import Cocoa
포함하다Foundation
따라서 이미 Import한 경우에는 다시 Import할 필요가 없습니다.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
Swift 5에서는 다음 세 가지 예 중 하나를 선택하여 문제를 해결할 수 있습니다.
#1. 사용방법String
의init(format:_:)
이니셜라이저
Foundation
Swift 제공String
a init(format:_:)
이니셜라이저 init(format:_:)
에는 다음 선언이 있습니다.
init(format: String, _ arguments: CVarArg...)
a를 반환한다.
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
a init(format:arguments:)
이니셜라이저 init(format:arguments:)
에는 다음 선언이 있습니다.
init(format: String, arguments: [CVarArg])
a를 반환한다.
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
Foundation은 다음과 같은 정보를 제공합니다.
의 인스턴스
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")
왼쪽 패딩의 경우 다음과 같은 문자열 확장자를 추가합니다.
Swift 5.0 이상
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"))
}
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"
스위프트 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
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`
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
다른 답변은 형식 문자열을 사용하여 숫자만 다루는 경우에는 좋지만 패딩이 필요한 문자열이 있을 경우 유용합니다(질문과 조금 다른 점은 인정하지만 정신은 비슷합니다).또한 끈이 패드보다 길면 주의하세요.
let str = "a str"
let padAmount = max(10, str.count)
String(repeatElement("-", count: padAmount - str.count)) + str
" ""-----a str"
다음 코드는 앞에 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
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"
세부 사항
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" 텍스트를 추가할 수도 있습니다.
for myInt in 1...3 {
println("0" + "\(myInt)")
}
그러나 각 개별 숫자에 대해 지정된 양의 0을 추가해야 하는 경우에는 포맷터가 더 나은 경우가 많습니다.단, 0을 하나만 추가하면 됩니다.
언급URL : https://stackoverflow.com/questions/25566581/leading-zeros-for-int-in-swift
'programing' 카테고리의 다른 글
TextBox에 추가하는 이유는 무엇입니까?루프 중에 텍스트가 반복될 때마다 더 많은 메모리를 차지합니까? (0) | 2023.04.16 |
---|---|
시스템 변환 방법창문들.'시스템'에 Input.Key를 입력합니다.창문들.양식. 열쇠? (0) | 2023.04.16 |
콘솔을 클리어하려면 (0) | 2023.04.16 |
셸 스크립트의 행 끝에 세미콜론이 필요합니까? (0) | 2023.04.11 |
XlsxWriter로 쓴 후 셀에 형식 적용 (0) | 2023.04.11 |