Como eu adicionaria vírgulas a um número que estou recuperando de um JSON no swift.
Example
31908551587 to
31,908,551,587
Estou tão confuso e não tenho ideia do que fazer.
Você pode fazer isso com 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)
Expandindo a resposta de Özgür Ersil, você pode isolar a funcionalidade com uma extensão para Int:
extension Int { func withCommas() -> String { let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .decimal return numberFormatter.string(from: NSNumber(value:self))! } }
Para usar em seu código como:
fonte
Também expandindo a resposta de Juan Fran Jimenez, eu recomendaria colocar o formatador em um singleton, uma vez que instanciar um formatador geralmente é uma operação relativamente cara. (Isso pode afetar o desempenho se você formatar em trânsito, conforme o usuário escreve.)
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)) ?? "" } }
fonte
Uma simples queda na extensão que fornecerá uma variável por meio de uma extensão de
Int
.Conforme observado na resposta de Julien, ele usa um formatador estático por motivos de desempenho.
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 usá-lo:
let number = 31908551587 print(number.delimiter) // 31,908,551,587
fonte
internal var
e você apenas temvar
. O que sua resposta adiciona à conversa? Além disso, eu diria que sua variáveldelimiter
é enganosa. O de JuliencommaRepresentation
é muito mais útil.Esta é uma forma adicional de definir a posição da vírgula. Digamos que eu queira que o número 10000000 seja impresso como "1,00,00,000"
let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .decimal numberFormatter.groupingSize = 3 numberFormatter.secondaryGroupingSize = 2 numberFormatter.string(from: 10000000)
fonte
Swift 4
let largeNumber = 31908551587 let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .decimal let formattedNumber = numberFormatter.string(from: NSNumber(value:largeNumber))
fonte
Eu criei uma classe para o campo de texto amount. Basta configurá-lo para sua classe de campo de texto. Ex- Digite 1234567. Ele irá convertê-lo para 1.234.567. Também funciona para entrada decimal, terá dois dígitos após o 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) }}
fonte