Подтвердить что ты не робот

Добавление Thousand Separator в Int в Swift

Я новичок в Swift и испытываю большие проблемы с поиском способа добавить пространство в качестве разделителя тысяч.

То, что я надеюсь достичь, - это результат вычисления и отображения его в текстовом поле, чтобы формат был следующим:

2 358 000

вместо

2358000

например.

Я не уверен, должен ли я форматировать значение Int, а затем преобразовывать его в String или добавлять пространство после преобразования значения Int в String. Любая помощь будет принята с благодарностью.

4b9b3361

Ответ 1

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

update: Xcode 9 • Swift 4

extension Formatter {
    static let withSeparator: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.groupingSeparator = " "
        formatter.numberStyle = .decimal
        return formatter
    }()
}

extension BinaryInteger {
    var formattedWithSeparator: String {
        return Formatter.withSeparator.string(for: self) ?? ""
    }
}

Xcode 8.3.2 • Swift 3.1

extension Formatter {
    static let withSeparator: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.groupingSeparator = " "
        formatter.numberStyle = .decimal
        return formatter
    }()
}

extension Integer {
    var formattedWithSeparator: String {
        return Formatter.withSeparator.string(for: self) ?? ""
    }
}

let myInt = 2358000
let myIntString = myInt.formattedWithSeparator  // "2 358 000"

Примечание. Если вы хотите иметь пространство с той же шириной периода, вы можете использовать "\u{2008}"

unicode space

formatter.groupingSeparator = "\u{2008}"

Ответ 2

Вы хотите использовать NSNumberFormatter:

let fmt = NSNumberFormatter()
fmt.numberStyle = .DecimalStyle
fmt.stringFromNumber(2358000)  // with my locale, "2,358,000"
fmt.locale = NSLocale(localeIdentifier: "fr_FR")
fmt.stringFromNumber(2358000)  // "2 358 000"

Ответ 3

С Swift 5, когда вам нужно отформатировать отображение чисел, NumberFormatter является правильным инструментом.


NumberFormatter имеет свойство с именем numberStyle. numberStyle может быть установлено в значение NumberFormatter.Style.decimal, чтобы установить стиль форматера в десятичный.

Поэтому в простейшем случае, когда вы хотите отформатировать число с десятичным стилем, вы можете использовать следующий код Playground:

import Foundation

let formatter = NumberFormatter()
formatter.numberStyle = NumberFormatter.Style.decimal

let amount = 2358000
let formattedString = formatter.string(for: amount)
print(String(describing: formattedString))

В соответствии с текущей Optional("2,358,000") пользователя, этот код будет печатать Optional("2 358 000") для en_US или Optional("2 358 000") для fr_FR.


Обратите внимание, что следующий фрагмент кода, который использует NumberFormatter locale набор свойств для Locale.current эквивалентно предыдущему коду Playground:

import Foundation

let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.locale = Locale.current

let amount = 2358000
let formattedString = formatter.string(for: amount)
print(String(describing: formattedString))

Приведенный ниже код игровой площадки, в NumberFormatter свойства NumberFormatter groupingSeparator установлено значение Locale.current.groupingSeparator, также эквивалентен первому:

import Foundation

let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.groupingSeparator = Locale.current.groupingSeparator

let amount = 2358000
let formattedString = formatter.string(for: amount)
print(String(describing: formattedString))

В противном случае, если вы хотите установить форматирование чисел с помощью определенного стиля форматирования локали, вы можете использовать следующий код Playground:

import Foundation

let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.locale = Locale(identifier: "FR_fr")

let amount = 2358000
let formattedString = formatter.string(for: amount)
print(String(describing: formattedString))
// prints: Optional("2 358 000")

Однако, если вы действительно хотите применить конкретный разделитель групп, вы можете использовать код Playground ниже:

import Foundation

let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.groupingSeparator = " "

let amount = 2358000
let formattedString = formatter.string(for: amount)
print(String(describing: formattedString))
// prints: Optional("2 358 000")

Ответ 4

Лев Дабус отвечает на перевод Swift 3:

В любой файл .swift, вне класса:

struct Number {
    static let withSeparator: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.groupingSeparator = " " // or possibly "." / ","
        formatter.numberStyle = .decimal
        return formatter
    }()
}
extension Integer {
    var stringWithSepator: String {
        return Number.withSeparator.string(from: NSNumber(value: hashValue)) ?? ""
    }
}

Использование:

let myInteger = 2358000
let myString = myInteger.stringWithSeparator  // "2 358 000"

Ответ 5

Попробуй это

func addPoints(inputNumber: NSMutableString){
    var count: Int = inputNumber.length
    while count >= 4 {
        count = count - 3
        inputNumber.insert(" ", at: count) // you also can use "," 
    }
    print(inputNumber)
}

Вызов:

addPoints(inputNumber: "123456")

Результат:

123 456 (или 123 456)

Ответ 6

Можно ли конвертировать из String в неформатированное число? Например, от "1.200.300" до