Відповіді:
Припустимо, що ви хочете довжину поля 2 з провідними нулями, ви зробите це:
import Foundation
for myInt in 1 ... 3 {
print(String(format: "%02d", myInt))
}
вихід:
01 02 03
Це import Foundationтехнічно вимагає, що це не частина мови Swift, а можливість, що надається Foundationрамкою. Зауважте, що обидва import UIKitі import Cocoaвключають, Foundationтому не потрібно їх імпортувати знову, якщо ви вже імпортували Cocoaабо UIKit.
Рядок формату може визначати формат декількох елементів. Наприклад, якщо ви намагаєтесь відформатувати 3години, 15хвилини та 7секунди, 03:15:07ви можете зробити це так:
let hours = 3
let minutes = 15
let seconds = 7
print(String(format: "%02d:%02d:%02d", hours, minutes, seconds))
вихід:
03:15:07
println("0\(myInt)")вашу пропозицію. Це використовує нативний клас String Swift замість того, щоб пройти формат NSString.
String(format: "%03d", myInt)дасть тобі "000", "001", ... , "099", "100".
-3, -9має місце, воно все одно повертає те саме, що не веде до нуля.
За допомогою Swift 5 ви можете вибрати один із трьох наведених нижче прикладів для вирішення своєї проблеми.
String«s init(format:_:)ініціалізаторFoundationзабезпечує Swift Stringв init(format:_:)ініціалізатор. init(format:_:)має таку заяву:
init(format: String, _ arguments: CVarArg...)
Повертає
Stringоб'єкт, ініціалізований за допомогою заданого рядка формату як шаблону, на який підміняються решта значень аргументу.
Наведений нижче код майданчика показує, як створити Stringвідформатований формат Intз принаймні двома цілими цифрами за допомогою 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"
String«s init(format:arguments:)ініціалізаторFoundationзабезпечує Swift Stringв init(format:arguments:)ініціалізатор. init(format:arguments:)має таку заяву:
init(format: String, arguments: [CVarArg])
Повертає
Stringоб'єкт, ініціалізований за допомогою заданого рядка формату в якості шаблону, в який інші параметри аргументу підміняються відповідно до мови за замовчуванням користувача.
Наведений нижче код майданчика показує, як створити Stringвідформатований формат Intз принаймні двома цілими цифрами за допомогою 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"
NumberFormatterФонд забезпечує NumberFormatter. Apple заявляє про це:
Екземпляри
NSNumberFormatterформатування текстуального подання комірок, що містятьNSNumberоб'єкти, та перетворення текстових зображень числових значень вNSNumberоб'єкти. Представлення охоплює цілі числа, плаваючі та парні; поплавці та подвійні елементи можуть бути відформатовані до заданої десяткової позиції.
Наступний код показує , як майданчик створити NumberFormatterщо повертається 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")
Для лівої підкладки додайте розширення рядка таким чином:
Швидкий 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
}
}
Швидкий 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
}
}
Використовуючи цей метод:
for myInt in 1...3 {
print("\(myInt)".padLeft(totalWidth: 2, with: "0"))
}
Швидкий 3.0+
Ліва набивка Stringрозширення схожі на padding(toLength:withPad:startingAt:)ін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
}
}
Використання:
let s = String(123)
s.leftPadding(toLength: 8, withPad: "0") // "00000123"
withPadпереданий аргумент більше одного символу.
Відповіді @imanuo вже чудові, але якщо ви працюєте з повноцінною програмою, ви можете розглянути таке розширення:
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 ""
}
}
Таким чином ви можете телефонувати куди завгодно:
String(withInt: 3)
// prints 03
String(withInt: 23, leadingZeros: 4)
// prints 0023
"42".leadingZeros(2)
// prints 42
"54".leadingZeros(3)
// prints 054
Інші відповіді хороші, якщо ви маєте справу лише з числами, використовуючи рядок формату, але це добре, коли у вас можуть бути рядки, які потрібно застебнути (хоча, мабуть, трохи відрізняються від заданого питання, схоже за духом). Також будьте обережні, якщо струна довша за колодку.
let str = "a str"
let padAmount = max(10, str.count)
String(repeatElement("-", count: padAmount - str.count)) + str
Вихідні дані "-----a str"
Xcode 9.0.1, швидкий 4.0
Дані
import Foundation
let array = [0,1,2,3,4,5,6,7,8]
Рішення 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"))
}
Рішення 2
for item in array {
print(String(repeatElement("0", count: 2)) + "\(item)")
}
Рішення 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" перед кожним номером всередині циклу, як це:
for myInt in 1...3 {
println("0" + "\(myInt)")
}
Але форматування часто краще, якщо вам доведеться додати припущену кількість 0 у кожне окреме число. Якщо вам потрібно лише додати один 0, то це справді лише ваш вибір.