jak szybko dodać przecinki do liczby?

85

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ć.

Omar Qureshi
źródło

Odpowiedzi:

169

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)
Özgür Ersil
źródło
czy jest jakiś sposób na zrobienie tego '31, 90,85,51,587 'przy użyciu NumberFormatter?
Sanket_B
@SanketBhavsar i don't think so check
Özgür Ersil
2
@ ÖzgürErsil Zrobiłem to z walutą (stylem)
Sanket_B
jak to zrobić w tył
Yestay Muratov
Czy istnieje sposób na przeliczenie 1000000000000000 na 100000000000000? Ponieważ to działa dla siódemki 0 po numerze ...
Cemal BAYRI
43

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:

largeNumber.withCommas()
Juan Fran Jimenez
źródło
12

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)) ?? ""
    }
}
Julien Perrenoud
źródło
10

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
CodeBender
źródło
1
??? Twój kod jest praktycznie identyczny z odpowiedzią Juliena. Jedyną różnicą jest to, że on ma, internal vara ty po prostu masz var. Co twoja odpowiedź wnosi do rozmowy? Powiedziałbym też, że twoja zmienna delimiterjest myląca. Julien's commaRepresentationjest znacznie bardziej przydatny.
Zonker.in.Geneva
2

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)
Rikesh Subedi
źródło
1

Szybki 4

let largeNumber = 31908551587
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
let formattedNumber = numberFormatter.string(from: NSNumber(value:largeNumber))
Ben
źródło
0

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)
}}
Vijay Patidar
źródło
Nie, używam NSNumberFormatter. Dla walidacji dziesiętnej i innej umieściłem oddzielne warunki.
Vijay Patidar