如何在快捷键中给数字加逗号?

如何在从 JSON 中快速检索的数字中添加逗号。

Example
31908551587 to
31,908,551,587

我很困惑,我不知道该怎么办。

57407 次浏览

You can do it with 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)

Expanding on Özgür Ersil's answer, you can isolate the functionality with an extesion to Int:

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

To then use on your code as:

largeNumber.withCommas()

Also expanding on Juan Fran Jimenez's answer, I would recommend putting the formatter into a singleton, since instantiating a formatter is usually a relatively expensive operation. (It could affect the performance if you're formatting on-the-go as the user writes.)

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

This is an additional way of setting comma position. Let's say I want the number 10000000 to be printed as "1,00,00,000"

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

A simple drop in extension that will provide a variable via an extension of Int.

As noted in Julien's answer, this makes use of a static formatter for performance reasons.

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

To use it:

let number = 31908551587
print(number.delimiter) // 31,908,551,587

I have created a class for amount textfield. Simply set it to your textfield class. Ex- Enter 1234567. It will convert it to 1,234,567 Also work for decimal entry, will take two digits after 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)
}}

Swift 4

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