¿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.
¿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.
Respuestas:
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:
largeNumber.withCommas()
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)) ?? ""
}
}
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
internal var
y tú simplemente tienes var
. ¿Qué agrega su respuesta a la conversación? Además, diría que su variable delimiter
es engañosa. El de Julien commaRepresentation
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)
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)
}}