Добавление Thousand Separator в Int в Swift
Я новичок в Swift и испытываю большие проблемы с поиском способа добавить пространство в качестве разделителя тысяч.
То, что я надеюсь достичь, - это результат вычисления и отображения его в текстовом поле, чтобы формат был следующим:
2 358 000
вместо
2358000
например.
Я не уверен, должен ли я форматировать значение Int, а затем преобразовывать его в String или добавлять пространство после преобразования значения Int в String. Любая помощь будет принята с благодарностью.
Ответы
Ответ 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" до