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.
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.
Antworten:
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:
largeNumber.withCommas()
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)) ?? ""
}
}
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
internal var
und du hast es einfach var
. Was trägt Ihre Antwort zum Gespräch bei? Außerdem würde ich sagen, dass Ihre Variable delimiter
irreführend ist. Juliens commaRepresentation
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)
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)
}}