¿Cómo agregar comas a un número en rápido?

85

¿Cómo agregaría comas a un número que estoy recuperando de un JSON en rápido?

Example
31908551587 to
31,908,551,587

Estoy tan confundido y no tengo idea de qué hacer.

Omar Qureshi
fuente

Respuestas:

169

Puedes hacerlo con NSNumberFormatter

Rápido 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)
Özgür Ersil
fuente
¿Hay alguna forma de hacer esto '31, 90,85,51,587 'usando NumberFormatter?
Sanket_B
@SanketBhavsar, no lo creo, compruebe
Özgür Ersil
2
@ ÖzgürErsil Lo hice con moneda (estilo)
Sanket_B
cómo hacer marcha atrás
Yestay Muratov
¿Hay alguna forma de convertir 1000000000000000 a 1,000,000,000,000,000? Porque estos funcionan para siete 0 después del número ...
Cemal BAYRI
43

Ampliando la respuesta de Özgür Ersil, puede aislar la funcionalidad con una extensión a Int:

extension Int {
    func withCommas() -> String {
        let numberFormatter = NumberFormatter()
        numberFormatter.numberStyle = .decimal
        return numberFormatter.string(from: NSNumber(value:self))!
    }
}

Para luego usar en su código como:

largeNumber.withCommas()
Juan Fran Jiménez
fuente
12

Ampliando también la respuesta de Juan Fran Jimenez, recomendaría poner el formateador en un singleton, ya que crear una instancia de un formateador suele ser una operación relativamente costosa. (Podría afectar el rendimiento si formatea sobre la marcha mientras el usuario escribe).

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
fuente
10

Una simple caída en la extensión que proporcionará una variable a través de una extensión de Int .

Como se señaló en la respuesta de Julien, esto hace uso de un formateador estático por razones de rendimiento.

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

Para usarlo:

let number = 31908551587
print(number.delimiter) // 31,908,551,587
CodeBender
fuente
1
??? Su código es prácticamente idéntico a la respuesta de Julien. Lo único diferente es que él tiene internal vary tú simplemente tienes var. ¿Qué agrega su respuesta a la conversación? Además, diría que su variable delimiteres engañosa. El de Julien commaRepresentationes mucho más útil.
Zonker.in.Geneva
2

Esta es una forma adicional de establecer la posición de la coma. Digamos que quiero que el número 10000000 se imprima como "1,00,00,000".

let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.groupingSize = 3
numberFormatter.secondaryGroupingSize = 2
numberFormatter.string(from: 10000000)
Rikesh Subedi
fuente
1

Rápido 4

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

He creado una clase para el campo de texto de cantidad. Simplemente configúrelo en su clase de campo de texto. Por ejemplo, ingrese 1234567. Lo convertirá a 1,234,567 También funciona para entrada decimal, tomará dos dígitos después del decimal.

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
fuente
No, estoy usando NSNumberFormatter. Para la validación decimal y de otro tipo, pongo condiciones separadas.
Vijay Patidar