Wie würde ich einer Zahl, die ich schnell von einem JSON abrufe, Kommas hinzufügen?
Example
31908551587 to
31,908,551,587
Ich bin so verwirrt und habe keine Ahnung, was ich tun soll.
Sie können es mit tun 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)
Wenn Sie die Antwort von Özgür Ersil erweitern, können Sie die Funktionalität mit einer Erweiterung auf Int:
extension Int { func withCommas() -> String { let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .decimal return numberFormatter.string(from: NSNumber(value:self))! } }
So verwenden Sie Ihren Code wie folgt:
quelle
Um die Antwort von Juan Fran Jimenez zu erweitern, würde ich empfehlen, den Formatierer in einen Singleton zu setzen, da das Instanziieren eines Formatierers normalerweise eine relativ teure Operation ist. (Dies kann die Leistung beeinträchtigen, wenn Sie unterwegs formatieren, während der Benutzer schreibt.)
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)) ?? "" } }
quelle
Eine einfache Erweiterung, die eine Variable über eine Erweiterung von bereitstellt
Int
.Wie in Juliens Antwort erwähnt, wird aus Leistungsgründen ein statischer Formatierer verwendet.
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)) ?? "" } }
Um es zu benutzen:
let number = 31908551587 print(number.delimiter) // 31,908,551,587
quelle
internal var
und du hast es einfachvar
. Was trägt Ihre Antwort zum Gespräch bei? Außerdem würde ich sagen, dass Ihre Variabledelimiter
irreführend ist. JulienscommaRepresentation
ist viel nützlicher.Dies ist eine zusätzliche Möglichkeit, die Kommaposition festzulegen. Angenommen, ich möchte, dass die Nummer 10000000 als "1,00,00,000" gedruckt wird.
let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .decimal numberFormatter.groupingSize = 3 numberFormatter.secondaryGroupingSize = 2 numberFormatter.string(from: 10000000)
quelle
Swift 4
let largeNumber = 31908551587 let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .decimal let formattedNumber = numberFormatter.string(from: NSNumber(value:largeNumber))
quelle
Ich habe eine Klasse für das Betragstextfeld erstellt. Stellen Sie es einfach auf Ihre Textfeldklasse ein. Bsp. Geben Sie 1234567 ein. Es konvertiert es in 1.234.567. Funktioniert auch für die Dezimaleingabe und nimmt zwei Nachkommastellen an.
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) }}
quelle