web-dev-qa-db-fra.com

Principaux zéros pour Int dans Swift

J'aimerais convertir une Int dans Swift en une String avec zéros non significatifs. Par exemple, considérons ce code:

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

Actuellement, le résultat est:

1
2
3

Mais je veux que ce soit:

01
02
03

Existe-t-il un moyen propre de le faire dans les bibliothèques standard Swift?

229
Dschee

En supposant que vous souhaitiez une longueur de champ de 2 avec des zéros non significatifs, procédez comme suit:

import Foundation

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

sortie:

01
02
03

Ceci nécessite import Foundation, donc techniquement, il ne fait pas partie de la langue Swift, mais une fonctionnalité fournie par le cadre Foundation. Notez que import UIKit et import Cocoa incluent Foundation. Il n'est donc pas nécessaire de l'importer à nouveau si vous avez déjà importé Cocoa ou UIKit.


La chaîne de format peut spécifier le format de plusieurs éléments. Par exemple, si vous essayez de formater 3 heures, 15 minutes et 7 secondes en 03:15:07, vous pouvez le faire comme suit:

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

sortie:

03:15:07
513
vacawama

Avec Swift 4.2, vous pouvez choisir l’un des trois exemples ci-dessous pour résoudre votre problème.


#1. Utilisation de l'initialisateur String's init(format:_:)

Foundation fournit à Swift String un initialiseur init(format:_:). init(format:_:) a la déclaration suivante:

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

Renvoie un objet String initialisé à l'aide d'une chaîne de format donnée en tant que modèle dans lequel les valeurs d'argument restantes sont substituées.

Le code de terrain de jeu suivant montre comment créer une String formatée à partir de Int avec au moins deux chiffres entiers à l'aide de 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. Utilisation de l'initialisateur String's init(format:arguments:)

Foundation fournit à Swift String un initialiseur init(format:arguments:). init(format:arguments:) a la déclaration suivante:

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

Renvoie un objet String initialisé à l'aide d'une chaîne de format donnée en tant que modèle dans lequel les valeurs d'argument restantes sont substituées en fonction des paramètres régionaux par défaut de l'utilisateur.

Le code de terrain de jeu suivant montre comment créer une String formatée à partir de Int avec au moins deux chiffres entiers à l'aide de 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. Utiliser NumberFormatter

La fondation fournit NumberFormatter . Apple en parle:

Les instances de NSNumberFormatter mettent en forme la représentation textuelle de cellules contenant des objets NSNumber et convertissent les représentations textuelles de valeurs numériques en objets NSNumber. La représentation comprend des entiers, des flottants et des doubles; les flottants et les doubles peuvent être formatés à une position décimale spécifiée.

Le code de terrain de jeu suivant montre comment créer une NumberFormatter qui renvoie String? à partir d'une Int avec au moins deux chiffres entiers:

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")
122
Imanou Petit

Pour un remplissage à gauche, ajoutez une extension de chaîne comme ceci:

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

En utilisant cette méthode:

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

Swift 3.0+

Rembourrage gauche String extension semblable à padding(toLength:withPad:startingAt:) dans 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
    }
}

Usage:

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

dans Xcode 8.3.2, iOS 10.3 C'est bon à maintenant

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
2
Steffen

Les autres réponses sont bonnes si vous ne traitez que des nombres utilisant la chaîne de format, mais c'est utile lorsque vous pouvez avoir des chaînes qui doivent être complétées (bien qu'il soit vrai qu'un peu différent de la question posée, son esprit soit similaire). Aussi, soyez prudent si la chaîne est plus longue que le pad. 

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

"-----a str" de sortie

1
possen

Détails

Xcode 9.0.1, Swift 4.0

Solutions

Les données

import Foundation

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

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

Solution 2

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

Solution 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
Vasily Bodnarchuk

Swift 5

@imanuo répond est déjà une bonne chose, mais si vous travaillez avec une application pleine de nombre, vous pouvez envisager une extension comme celle-ci:

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

}

De cette façon, vous pouvez appeler n'importe où:

String(withInt: 3) 
// prints 03

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

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