¿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.
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)
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:
fuente
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)) ?? "" } }
fuente
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
fuente
internal var
y tú simplemente tienesvar
. ¿Qué agrega su respuesta a la conversación? Además, diría que su variabledelimiter
es engañosa. El de JuliencommaRepresentation
es mucho más útil.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)
fuente
Rápido 4
let largeNumber = 31908551587 let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .decimal let formattedNumber = numberFormatter.string(from: NSNumber(value:largeNumber))
fuente
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) }}
fuente