Ceros a la izquierda para Int en Swift

Me gustaría convertir un Int en Swift en una String con ceros a la izquierda. Por ejemplo, considere este código:

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

Actualmente el resultado de esto es:

 1 2 3 

Pero quiero que sea:

 01 02 03 

¿Hay alguna forma clara de hacerlo en las bibliotecas estándar de Swift?

Suponiendo que quieres una longitud de campo de 2 con ceros a la izquierda, harías esto:

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

salida:

 01 02 03 

Esto requiere import Foundation por lo que técnicamente no es parte del lenguaje Swift, sino una capacidad proporcionada por el marco de Foundation . Tenga en cuenta que tanto la import UIKit como la import Cocoa incluyen Foundation por lo que no es necesario importarla de nuevo si ya ha importado Cocoa o UIKit .


La cadena de formato puede especificar el formato de varios elementos. Por ejemplo, si está intentando formatear 3 horas, 15 minutos y 7 segundos en 03:15:07 , podría hacerlo así:

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

salida:

 03:15:07 

Con Swift 4, puede elegir uno de los tres ejemplos que se muestran a continuación para resolver su problema.


# 1. Usando el init(format:_:) String

Foundation proporciona a Swift String un init(format:_:) . init(format:_:) tiene la siguiente statement:

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

Devuelve un objeto String inicializado utilizando una cadena de formato dada como una plantilla en la que se sustituyen los valores de argumento restantes.

El siguiente código de Playground muestra cómo crear una String formateada desde Int con al menos dos dígitos enteros 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. Usar el iniciador init(format:arguments:) String

Foundation proporciona a Swift String un iniciador init(format:arguments:) . init(format:arguments:) tiene la siguiente statement:

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

Devuelve un objeto String inicializado utilizando una cadena de formato dada como una plantilla en la que los valores de argumento restantes se sustituyen de acuerdo con la configuración regional predeterminada del usuario.

El siguiente código de Playground muestra cómo crear una String formateada desde Int con al menos dos dígitos enteros 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

Foundation proporciona NumberFormatter . Apple dice al respecto:

Las instancias de NSNumberFormatter formatean la representación textual de celdas que contienen objetos NSNumber y convierten representaciones textuales de valores numéricos en objetos NSNumber . La representación abarca enteros, flotantes y dobles; los flotantes y los dobles se pueden formatear a una posición decimal especificada.

El siguiente código de Playground muestra cómo crear un NumberFormatter que devuelve String? desde un Int con al menos dos dígitos enteros:

 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 el relleno izquierdo, agregue una extensión de cadena 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:) izquierdo Extensión de String similar al padding(toLength:withPad:startingAt:) en 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" 

en Xcode 8.3.2, iOS 10.3 Eso es bueno ahora

Muestra1:

 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 

Detalles

Xcode 9.0.1, swift 4.0

Soluciones

Datos

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

Solución 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")) } 

Solución 2

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

Solución 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)") } 

Las otras respuestas son buenas si se trata solo de números usando la cadena de formato, pero esto es bueno cuando puede tener cadenas que deben rellenarse (aunque es cierto que un poco diferente de la pregunta formulada, parece similar en espíritu). Además, tenga cuidado si la cuerda es más larga que la almohadilla.

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

Salida "-----a str"

A diferencia de las otras respuestas que usan un formateador, también puedes agregar un texto “0” delante de cada número dentro del ciclo, como este:

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

Pero el formateador a menudo es mejor cuando tiene que sumr, suponga una cantidad designada de 0 para cada número separado. Si solo necesitas agregar un 0, entonces realmente es tu elección.