it-swarm.com.ru

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

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

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

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

1
2
3

Но я хочу, чтобы это было:

01
02
03

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

229
Dschee

Предполагая, что вам нужно поле длиной 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
513
vacawama

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


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

Foundation предоставляет Swift String инициализатор init(format:_:). init(format:_:) имеет следующую декларацию:

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

Возвращает объект String, инициализированный с использованием заданной строки формата в качестве шаблона, в который подставляются оставшиеся значения аргумента.

В следующем коде Playground показано, как создать 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 предоставляет Swift String инициализатор init(format:arguments:). init(format:arguments:) имеет следующую декларацию:

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

Возвращает объект String, инициализированный с использованием заданной строки формата в качестве шаблона, в который подставляются оставшиеся значения аргумента в соответствии с локалью пользователя по умолчанию.

В следующем коде Playground показано, как создать 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. Представление включает в себя целые числа, числа с плавающей запятой и двойные числа; числа с плавающей запятой и двойники могут быть отформатированы до указанной десятичной позиции.

Следующий код Playground показывает, как создать 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")
122
Imanou Petit

Для заполнения слева добавьте расширение строки, например:

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"))
}
11
Kiran P Nair

Swift 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"
6
John Cromie

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

Образец1:

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

Образец2:

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

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

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

Выходной "-----a str"

1
possen

Подробности

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)")
}
0
Vasily Bodnarchuk