Swift'te Int için önde gelen sıfırlar


305

IntSwift içindeki bir Stringkelimeyi baştaki sıfırlara sahip bir a dönüştürmek istiyorum . Örneğin bu kodu düşünün:

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

Şu anda bunun sonucu:

1
2
3

Ama olmasını istiyorum:

01
02
03

Swift standart kütüphanelerinde bunu yapmanın temiz bir yolu var mı?

Yanıtlar:


670

Başında sıfır bulunan 2 alan uzunluğunu istediğinizi varsayarsak bunu yaparsınız:

import Foundation

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

çıktı:

01
02
03

Bu, import Foundationteknik olarak Swift dilinin bir parçası değil, Foundationçerçeve tarafından sağlanan bir yetenek gerektirir . Her ikisinin de dahil edildiğini import UIKitve bu nedenle zaten içe aktardıysanız veya tekrar içe aktarmanız gerekmediğini unutmayın .import CocoaFoundationCocoaUIKit


Biçim dizesi birden çok öğenin biçimini belirtebilir. Örneğin, 3saatleri, 15dakikaları ve 7saniyeleri biçimlendirmeye çalışıyorsanız 03:15:07bunu şöyle yapabilirsiniz:

let hours = 3
let minutes = 15
let seconds = 7
print(String(format: "%02d:%02d:%02d", hours, minutes, seconds))

çıktı:

03:15:07

2
Bu Swift'in bir parçası olmasa da aslında çok temiz görünüyor. Bence bunu yapmanın yerel bir yolu yok, bu yüzden şimdilik bu en yakın olabilir. Teşekkürler vacawama. :)
Jeehut

1
Bu arada: Numaramın önünde tek bir sıfır isteseydim println("0\(myInt)")önerinizi seçerdim. Bu, NSString biçimlendirmesi yerine Swift yerel String sınıfını kullanır.
Jeehut

6
"10", hehe elde edene kadar yararlıdır
Jose M Pan

7
String(format: "%03d", myInt)verecek "000", "001", ... , "099", "100".
vacawama

1
Bu gibi bir değer -3, -9oluşursa sorun , yine de sıfır olmadan aynı döndürür.
Codetard

139

Swift 5 ile sorununuzu çözmek için aşağıda gösterilen üç örnekten birini seçebilirsiniz .


# 1. String'In init(format:_:)başlatıcısını kullanma

FoundationSwift'e Stringbir init(format:_:)başlatıcı sunar. init(format:_:)aşağıdaki beyanı içerir:

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

StringKalan bağımsız değişken değerlerinin değiştirildiği şablon olarak belirli bir biçim dizesi kullanılarak başlatılan nesneyi döndürür .

Aşağıdaki Oyun Alanı kodu, kullanılarak en az iki tamsayı hanesiyle Stringbiçimlendirilmiş bir öğenin nasıl oluşturulacağını gösterir :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. String'In init(format:arguments:)başlatıcısını kullanma

FoundationSwift'e Stringbir init(format:arguments:)başlatıcı sunar. init(format:arguments:)aşağıdaki beyanı içerir:

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

StringKalan bağımsız değişken değerlerinin, kullanıcının varsayılan yerel ayarına göre değiştirildiği şablon olarak belirli bir biçim dizesi kullanılarak başlatılan nesneyi döndürür .

Aşağıdaki Oyun Alanı kodu, kullanılarak en az iki tamsayı hanesiyle Stringbiçimlendirilmiş bir öğenin nasıl oluşturulacağını gösterir :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"

3.. kullanmaNumberFormatter

Vakıf sağlar NumberFormatter. Apple bunun hakkında şunları söylüyor:

Örneklerini NSNumberFormatterbiçimi içeren hücrelerin metinsel gösterimi NSNumbernesneleri içine sayısal değerler metinsel temsillerini dönüştürmek NSNumbernesneler. Temsil tamsayıları, dalgalanmaları ve çiftleri kapsar; şamandıralar ve çiftler, belirtilen bir ondalık konuma biçimlendirilebilir.

Aşağıdaki Oyun Alanı kodu, en az iki tamsayı basamağı olan bir NumberFormatteralandan dönen bir oyun alanının nasıl oluşturulacağını gösterir :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")

Birden fazla yerde sayıları aynı şekilde biçimlendirmek istediğinizde cevabınızın doğru olduğunu düşünüyorum. Ben istemediğim gibi vacawama'nın cevabını doğru seçtim ama. Ama cevap için teşekkürler! :)
Jeehut

@ImanouPetit. FYI, ben bunu minimum sayı basamakları 3 ile kullandım. sonra dizeler İsteğe bağlı ("001") içerir, bu nedenle dinamik olarak bir görüntü yolu seçmek için kodum başarısız olur. '! "
İle paketini açmak

11

Sol dolgu için aşağıdaki gibi bir dize uzantısı ekleyin:

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

Bu yöntemi kullanarak:

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

1
neden?! bunun avantajı nedir?
Mike Glukhov

7

Swift 3.0 ve üzeri

Sol dolgusu Stringbenzer uzatma padding(toLength:withPad:startingAt:)inFoundation

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

Kullanımı:

let s = String(123)
s.leftPadding(toLength: 8, withPad: "0") // "00000123"

1
Bu, kullanıcı, withPadiletilen bağımsız değişkenin tek bir karakterden fazla olup olmadığını beklediği gibi çalışabilir veya çalışmayabilir .
nhgrif

4

Hızlı 5

@imanuo cevapları zaten harika, ancak sayı dolu bir uygulama ile çalışıyorsanız, böyle bir uzantıyı düşünebilirsiniz:

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

}

Bu şekilde, istediğiniz her yeri arayabilirsiniz:

String(withInt: 3) 
// prints 03

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

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

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

uzantıları FTW .. !! Bu Swift 4'te de işe yaradı. Eski kodları 3'ten 4'e ve sonunda Swift 5'e taşımak için uğraşanlarımız için ... :)
Nick N

3

Xcode 8.3.2'de, iOS 10.3 Thats artık iyi

sample1:

let dayMoveRaw = 5 
let dayMove = String(format: "%02d", arguments: [dayMoveRaw])
print(dayMove) // 05

Sample2:

let dayMoveRaw = 55 
let dayMove = String(format: "%02d", arguments: [dayMoveRaw])
print(dayMove) // 55

1

Diğer biçimler, yalnızca biçim dizesini kullanan sayılarla uğraşıyorsanız iyidir, ancak doldurulması gereken dizelere sahip olduğunuzda bu iyidir (kuşkusuz, sorulan sorudan biraz farklı olsa da, ruh olarak benzer görünüyor). Ayrıca, dize altlıktan daha uzunsa dikkatli olun.

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

Çıktı "-----a str"


0

ayrıntılar

Xcode 9.0.1, hızlı 4.0

Çözümler

Veri

import Foundation

let array = [0,1,2,3,4,5,6,7,8]

Çözüm 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"))
}

Çözüm 2

for item in array {
    print(String(repeatElement("0", count: 2)) + "\(item)")
}

Çözüm 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 yaklaşımınız gibi, dolgu dizeleri için cevabım bakın.
possen

Bunlar iki basamaklı giriş için çalışmaz (örneğin 10, 010 olur). Ayrıca asıl soru Standart Kütüphaneleri içeren çözümleri sordu. @ImanouPetit tarafından verilen cevap tercih edilir.
cleverbit

-12

Bir biçimlendirici kullanan diğer yanıtların aksine, döngünün içindeki her sayının önüne şu şekilde bir "0" metni ekleyebilirsiniz:

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

Ancak, her ayrı sayı için belirtilen miktarda 0s olduğunu varsayalım. Yine de sadece bir tane eklemeniz gerekiyorsa, o zaman sadece sizin seçiminizdir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.