string - float - Ceros iniciales para Int en Swift
int to string swift 4 (8)
Me gustaría convertir un Int
en Swift en una String
con ceros iniciales. Por ejemplo considera este código:
for myInt in 1...3 {
print("/(myInt)")
}
Actualmente el resultado es:
1
2
3
Pero quiero que sea:
01
02
03
¿Hay una forma limpia de hacerlo dentro de las bibliotecas estándar de Swift?
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"))
}
Solucion 2
for item in array {
print(String(repeatElement("0", count: 2)) + "/(item)")
}
Solucion 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)")
}
A diferencia de las otras respuestas que utilizan un formateador, también puede agregar un texto "0" delante de cada número dentro del bucle, de esta manera:
for myInt in 1...3 {
println("0" + "/(myInt)")
}
Pero el formateador a menudo es mejor cuando tiene que agregar suponer una cantidad designada de 0s por cada número separado. Sin embargo, si solo necesita agregar un 0, entonces es realmente su elección.
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
init(format:_:)
inicializador
Foundation
proporciona Swift String
a init(format:_:)
initializer. init(format:_:)
tiene la siguiente declaración:
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 Zona de juegos muestra cómo crear una String
formateada desde Int
con al menos dos dígitos enteros utilizando 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 el init(format:arguments:)
String
init(format:arguments:)
inicializador
Foundation
proporciona Swift String
un init(format:arguments:)
inicializador. init(format:arguments:)
tiene la siguiente declaración:
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 Zona de juegos muestra cómo crear una String
formateada desde Int
con al menos dos dígitos enteros utilizando 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
Fundación proporciona NumberFormatter
. Apple dice al respecto:
Las instancias de
NSNumberFormatter
formatean la representación textual de las celdas que contienen objetosNSNumber
y convierten las representaciones textuales de valores numéricos en objetosNSNumber
. La representación abarca enteros, flotantes y dobles; flotantes y dobles se pueden formatear a una posición decimal especificada.
El siguiente código de NumberFormatter
juegos muestra cómo crear un NumberFormatter
que devuelve String?
de 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")
Las otras respuestas son buenas si está tratando solo con números usando la cadena de formato, pero esto es bueno cuando puede tener cadenas que necesitan ser rellenadas (aunque es cierto que un poco diferente a la pregunta, 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"
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
}
}
Utilizando este método:
for myInt in 1...3 {
print("/(myInt)".padLeft(totalWidth: 2, with: "0"))
}
Suponiendo que desea una longitud de campo de 2 con ceros iniciales, haría esto:
import Foundation
for myInt in 1...3 {
print(String(format: "%02d", myInt))
}
salida:
01 02 03
Esto requiere import Foundation
así que técnicamente no es parte del lenguaje Swift sino una capacidad proporcionada por el marco de Foundation
. Tenga en cuenta que tanto import UIKit
como import Cocoa
incluyen Foundation
por lo que no es necesario volver a importarlo si ya ha importado Cocoa
o UIKit
.
La cadena de formato puede especificar el formato de varios elementos. Por ejemplo, si está tratando de 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
en Xcode 8.3.2, iOS 10.3 Eso es bueno ahora
Muestra 1:
let dayMoveRaw = 5
let dayMove = String(format: "%02d", arguments: [dayMoveRaw])
print(dayMove) // 05
Muestra2:
let dayMoveRaw = 55
let dayMove = String(format: "%02d", arguments: [dayMoveRaw])
print(dayMove) // 55
Swift 3.0+
Acolchado izquierdo Extensión de la 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"