Comment puis-je ajouter des virgules à un numéro que je récupère d'un JSON dans Swift.
Example
31908551587 to
31,908,551,587
Je suis tellement confus et je ne sais pas quoi faire.
Vous pouvez le faire avec NSNumberFormatter
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)
En développant la réponse d'Özgür Ersil, vous pouvez isoler la fonctionnalité avec une extension d'Int:
extension Int {
func withCommas() -> String {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = NumberFormatter.Style.decimal
return numberFormatter.string(from: NSNumber(value:self))!
}
}
Utiliser ensuite sur votre code en tant que:
largeNumber.withCommas()
Pour approfondir également la réponse de Juan Fran Jimenez, je recommanderais de placer le formateur dans un singleton, car instancier un formateur est généralement une opération relativement coûteuse. (Cela pourrait affecter les performances si vous formatez en déplacement au fur et à mesure que l'utilisateur écrit.)
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)) ?? ""
}
}
Une simple extension en extension qui fournira une variable via une extension de Int
.
Comme indiqué dans la réponse de Julien, cela utilise un formateur statique pour des raisons de performances.
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)) ?? ""
}
}
Pour l'utiliser:
let number = 31908551587
print(number.delimiter) // 31,908,551,587
C'est un moyen supplémentaire de définir une virgule. Disons que je veux que le nombre 10000000 soit imprimé comme "1,00,00,000"
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.groupingSize = 3
numberFormatter.secondaryGroupingSize = 2
numberFormatter.string(from: 10000000)
J'ai créé une classe pour montant textfield. Il suffit de le définir pour votre classe de champ de texte. Ex. Entrez 1234567. Il le convertira en 1 234 567. Le système fonctionne également avec une entrée décimale et prend deux chiffres après le nombre décimal.
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))