Ведущие нули для Int в Swift



Я хотел бы преобразовать Int в Swift на a String с ведущими нулями. Например рассмотрим этот код:



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


в настоящее время результатом его является:



1
2
3


но я хочу, чтобы это быть:



01
02
03


есть ли чистый способ сделать это в стандартных библиотеках Swift?

774   8  

8 ответов:

предполагая, что вы хотите длину поля 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

С Swift 4, Вы можете выбрать один из три примера показано ниже, чтобы решить вашу проблему.


#1. Используя String ' s init(format:_:) инициализатор

Foundation быстро String a init(format:_:) инициализатор. init(format:_:) есть следующее объявление:

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

возвращает a 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"

#2. Используя String ' s init(format:arguments:) инициализатор

Foundation быстро String a init(format:arguments:) инициализатор. init(format:arguments:) есть следующее объявление:

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

возвращает a 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"

#3. Используя 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")

для левого заполнения добавьте расширение строки следующим образом:

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

используя этот метод:

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

Swift 3.0+

левая обивка

в Xcode 8.3.2, iOS 10.3 Это хорошо сейчас

пример sample 1:

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

подробности

Xcode 9.0.1, swift 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)")
}

другие ответы хороши, если вы имеете дело только с числами, используя строку формата, но это хорошо, когда у вас могут быть строки, которые нужно дополнить (хотя, по общему признанию, немного отличается от заданного вопроса, кажется похожим по духу). Кроме того, будьте осторожны, если строка длиннее, чем коврик.

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

выход "-----a str"

В отличие от других ответов, которые используют форматер, вы также можете просто добавить текст " 0 " перед каждым числом внутри цикла, например:

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

но formatter часто лучше, когда вам нужно добавить предположим, определенное количество 0s для каждого отдельного числа. Если вам нужно только добавить один 0, то это действительно просто ваш выбор.

Comments

    Ничего не найдено.