Jak dodać przecinki do liczby, którą w szybki sposób pobieram z JSON.
Example
31908551587 to
31,908,551,587
Jestem taki zdezorientowany i nie mam pojęcia, co robić.
Możesz to zrobić za pomocą NSNumberFormatter
Szybki 4
let largeNumber = 31908551587
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
let formattedNumber = numberFormatter.string(from: NSNumber(value:largeNumber))
Szybki 3
let largeNumber = 31908551587
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = NumberFormatter.Style.decimal
let formattedNumber = numberFormatter.string(from: NSNumber(value:largeNumber))
Szybki 2
let largeNumber = 31908551587
let numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
let formattedNumber = numberFormatter.stringFromNumber(largeNumber)
Rozszerzając odpowiedź Özgür Ersil, możesz wyodrębnić funkcjonalność poprzez rozszerzenie do Int:
extension Int { func withCommas() -> String { let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .decimal return numberFormatter.string(from: NSNumber(value:self))! } }
Aby następnie użyć w swoim kodzie jako:
źródło
Rozwijając również odpowiedź Juana Fran Jimeneza, zalecałbym umieszczenie formatera w singletonie, ponieważ tworzenie instancji formatera jest zwykle stosunkowo kosztowną operacją. (Może to wpłynąć na wydajność, jeśli formatujesz w podróży, gdy pisze użytkownik).
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)) ?? "" } }
źródło
Prosty spadek rozszerzenia, który zapewni zmienną poprzez rozszerzenie
Int
.Jak zauważono w odpowiedzi Juliena, ze względu na wydajność wykorzystuje statyczny formatyzator.
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)) ?? "" } }
Aby z niego skorzystać:
let number = 31908551587 print(number.delimiter) // 31,908,551,587
źródło
internal var
a ty po prostu maszvar
. Co twoja odpowiedź wnosi do rozmowy? Powiedziałbym też, że twoja zmiennadelimiter
jest myląca. Julien'scommaRepresentation
jest znacznie bardziej przydatny.Jest to dodatkowy sposób ustawiania pozycji przecinka. Powiedzmy, że chcę, aby liczba 10000000 została wydrukowana jako „1,00,00 000”
let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .decimal numberFormatter.groupingSize = 3 numberFormatter.secondaryGroupingSize = 2 numberFormatter.string(from: 10000000)
źródło
Szybki 4
let largeNumber = 31908551587 let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .decimal let formattedNumber = numberFormatter.string(from: NSNumber(value:largeNumber))
źródło
Utworzyłem klasę dla pola tekstowego kwoty. Po prostu ustaw go na swoją klasę textfield. Np. - Wprowadź 1234567. Przekształci to na 1234,567. Działa również w przypadku wprowadzania dziesiętnego, przyjmuje dwie cyfry po przecinku.
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) }}
źródło