Zeros à esquerda para Int em Swift

Eu gostaria de converter um Int em Swift para uma String com zeros à esquerda. Por exemplo, considere este código:

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

Atualmente, o resultado é:

 1 2 3 

Mas eu quero que seja:

 01 02 03 

Existe uma maneira limpa de fazer isso dentro das bibliotecas padrão do Swift?

Supondo que você queira um comprimento de campo de 2 com zeros à esquerda, você faria isso:

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

saída:

 01 02 03 

Isso requer a import Foundation portanto, tecnicamente não faz parte da linguagem Swift, mas é um recurso fornecido pela estrutura do Foundation . Note que import UIKit e import Cocoa incluem o Foundation então não é necessário importá-lo novamente se você já tiver importado o Cocoa ou o UIKit .


A string de formato pode especificar o formato de vários itens. Por exemplo, se você está tentando formatar 3 horas, 15 minutos e 7 segundos em 03:15:07 você poderia fazer assim:

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

saída:

 03:15:07 

Com o Swift 4, você pode escolher um dos três exemplos mostrados abaixo para resolver seu problema.


# 1. Usando o init(format:_:) String init(format:_:) inicializador

Foundation fornece o Swift String um init(format:_:) inicializador. init(format:_:) tem a seguinte declaração:

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

Retorna um object String inicializado usando uma determinada string de formato como um modelo no qual os valores de argumentos restantes são substituídos.

O seguinte código Playground mostra como criar uma String formatada em Int com pelo menos dois dígitos inteiros usando 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. Usando o init(format:arguments:) String init(format:arguments:) inicializador

Foundation fornece o Swift String um init(format:arguments:) . init(format:arguments:) tem a seguinte declaração:

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

Retorna um object String inicializado usando uma determinada string de formato como um modelo no qual os valores de argumentos restantes são substituídos de acordo com a localidade padrão do usuário.

O seguinte código Playground mostra como criar uma String formatada em Int com pelo menos dois dígitos inteiros usando 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. Usando NumberFormatter

Fundação fornece NumberFormatter . A Apple afirma sobre isso:

Instâncias de NSNumberFormatter formatam a representação textual de células que contêm objects NSNumber e convertem representações textuais de valores numéricos em objects NSNumber . A representação engloba números inteiros, flutuantes e duplos; floats e duplas podem ser formatados para uma posição decimal especificada.

O seguinte código Playground mostra como criar um NumberFormatter que retorna String? de um Int com pelo menos dois dígitos inteiros:

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

Para preenchimento à esquerda, adicione uma extensão de string como esta:

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

Usando este método:

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

Swift 3.0+

padding(toLength:withPad:startingAt:) à esquerda Extensão de String semelhante ao padding(toLength:withPad:startingAt:) em 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 } } 

Uso:

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

no Xcode 8.3.2, iOS 10.3 Isso é bom agora

Amostra1:

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

Amostra2:

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

Detalhes

Xcode 9.0.1, rápido 4.0

Soluções

Dados

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

Solução 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")) } 

Solução 2

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

Solução 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)") } 

As outras respostas são boas se você está lidando apenas com números usando a string de formatação, mas isso é bom quando você pode ter strings que precisam ser preenchidas (embora admitidamente um pouco diferente do que a pergunta, parece similar em espírito). Além disso, tenha cuidado se a corda for maior que a almofada.

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

Saída "-----a str"

Ao contrário das outras respostas que usam um formatador, você também pode simplesmente adicionar um texto “0” na frente de cada número dentro do loop, assim:

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

Mas o formatador costuma ser melhor quando você precisa adicionar uma quantidade designada de 0s para cada número separado. Se você só precisa adicionar um 0, então é realmente só sua escolha.