Wie füge ich einer Zahl schnell Kommas hinzu?


85

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:


169

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)

Gibt es eine Möglichkeit, mit NumberFormatter so etwas wie '31, 90,85,51,587 'zu tun?
Sanket_B

@ SanketBhavsar ich glaube nicht so überprüfen
Özgür Ersil

2
@ ÖzgürErsil Ich habe es mit Währung (Stil) gemacht
Sanket_B

wie man rückwärts macht
Yestay Muratov

Gibt es eine Möglichkeit, 1000000000000000 in 1.000.000.000.000.000 umzuwandeln? Weil diese für sieben 0 nach der Zahl funktioniert ...
Cemal BAYRI

43

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()

12

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)) ?? ""
    }
}

10

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

1
??? Ihr Code ist praktisch identisch mit Juliens Antwort. Das einzige was anders ist, hat er internal varund du hast es einfach var. Was trägt Ihre Antwort zum Gespräch bei? Außerdem würde ich sagen, dass Ihre Variable delimiterirreführend ist. Juliens commaRepresentationist viel nützlicher.
Zonker.in.Geneva

2

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)

1

Swift 4

let largeNumber = 31908551587
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
let formattedNumber = numberFormatter.string(from: NSNumber(value:largeNumber))

0

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)
}}

Nein, ich verwende NSNumberFormatter. Für die Dezimal- und andere Validierung habe ich separate Bedingungen festgelegt.
Vijay Patidar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.