Как мне быстро добавить запятые к числу, которое я получаю из JSON.
Example
31908551587 to
31,908,551,587
Я в замешательстве и понятия не имею, что мне делать.
Вы можете сделать это с NSNumberFormatter
Swift 4
let largeNumber = 31908551587
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
let formattedNumber = numberFormatter.string(from: NSNumber(value:largeNumber))
Swift 3
let largeNumber = 31908551587
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = NumberFormatter.Style.decimal
let formattedNumber = numberFormatter.string(from: NSNumber(value:largeNumber))
Swift 2
let largeNumber = 31908551587
let numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
let formattedNumber = numberFormatter.stringFromNumber(largeNumber)
Расширяя ответ Озгюра Эрсила, вы можете изолировать функциональность с расширением до Int:
extension Int { func withCommas() -> String { let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .decimal return numberFormatter.string(from: NSNumber(value:self))! } }
Чтобы затем использовать в своем коде как:
источник
Также, расширяя ответ Хуана Франа Хименеса, я бы рекомендовал поместить средство форматирования в синглтон, поскольку создание экземпляра средства форматирования обычно является относительно дорогой операцией. (Это может повлиять на производительность, если вы форматируете на ходу, когда пользователь пишет.)
extension Int { private static var commaFormatter: NumberFormatter = { let formatter = NumberFormatter() formatter.numberStyle = .decimal return formatter }() internal var commaRepresentation: String { return Int.commaFormatter.string(from: NSNumber(value: self)) ?? "" } }
источник
Простое добавляемое расширение, которое предоставит переменную через расширение
Int
.Как отмечалось в ответе Жюльена, это использует статический форматер по соображениям производительности.
extension Int { private static var numberFormatter: NumberFormatter = { let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .decimal return numberFormatter }() var delimiter: String { return Int.numberFormatter.string(from: NSNumber(value: self)) ?? "" } }
Чтобы использовать это:
let number = 31908551587 print(number.delimiter) // 31,908,551,587
источник
internal var
а у вас естьvar
. Что ваш ответ добавляет к разговору? Кроме того, я бы сказал, что ваша переменнаяdelimiter
вводит в заблуждение. ЖюльенcommaRepresentation
гораздо полезнее.Это дополнительный способ установки позиции запятой. Допустим, я хочу, чтобы число 10000000 было напечатано как «1,00,00,000».
let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .decimal numberFormatter.groupingSize = 3 numberFormatter.secondaryGroupingSize = 2 numberFormatter.string(from: 10000000)
источник
Swift 4
let largeNumber = 31908551587 let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .decimal let formattedNumber = numberFormatter.string(from: NSNumber(value:largeNumber))
источник
Я создал класс для текстового поля количества. Просто установите его в свой класс текстового поля. Пример: введите 1234567. Он преобразует его в 1 234 567. Также работает для десятичного ввода, будет принимать две цифры после запятой.
class AmountField: UITextField { private var isFirstDecimal : Bool = true override func willMove(toSuperview newSuperview: UIView?) { addTarget(self, action: #selector(editingChanged), for: .editingChanged) keyboardType = .decimalPad textAlignment = .left placeholder = "0.0" editingChanged() } override func deleteBackward() { var currentText = self.text ?? "" currentText = String(currentText.dropLast()) self.text = currentText editingChanged(self) } @objc func editingChanged(_ textField: UITextField? = nil) { var doubleStr = textField?.text ?? "00" let decimalCount = doubleStr.components(separatedBy: ".") if decimalCount.count > 2 { var currentText = self.text ?? "" currentText = String(currentText.dropLast()) self.text = currentText return } if doubleStr.contains(".") && isFirstDecimal == true { self.text = doubleStr isFirstDecimal = false return } else if !(doubleStr.contains(".")) { isFirstDecimal = true } let doubleStrTemp = doubleStr.replacingOccurrences(of: ",", with: "") if doubleStrTemp != "" { if let n = Decimal(string: doubleStrTemp )?.significantFractionalDecimalDigits { if n > 2 { var currentText = self.text ?? "" currentText = String(currentText.dropLast()) self.text = currentText return } } } doubleStr = doubleStr.replacingOccurrences(of: ",", with: "") let doube = Double(doubleStr) let numberFormatter = NumberFormatter() numberFormatter.numberStyle = NumberFormatter.Style.decimal if doube != nil { let formattedNumber = numberFormatter.string(from: NSNumber(value:doube!)) self.text = formattedNumber } }} extension Decimal { var significantFractionalDecimalDigits: Int { return max(-exponent, 0) }}
источник