Come aggiungerei virgole a un numero che sto recuperando da un JSON in modo rapido.
Example
31908551587 to
31,908,551,587
Sono così confuso e non ho idea di cosa fare.
Come aggiungerei virgole a un numero che sto recuperando da un JSON in modo rapido.
Example
31908551587 to
31,908,551,587
Sono così confuso e non ho idea di cosa fare.
Risposte:
Puoi farlo con 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)
Espandendo la risposta di Özgür Ersil, puoi isolare la funzionalità con un'estensione a Int:
extension Int {
func withCommas() -> String {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
return numberFormatter.string(from: NSNumber(value:self))!
}
}
Per poi usarlo sul tuo codice come:
largeNumber.withCommas()
Espandendo anche la risposta di Juan Fran Jimenez, consiglierei di inserire il formattatore in un singleton, poiché istanziare un formattatore è di solito un'operazione relativamente costosa. (Potrebbe influire sulle prestazioni se stai formattando in movimento mentre l'utente scrive.)
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)) ?? ""
}
}
Un semplice calo dell'estensione che fornirà una variabile tramite un'estensione di Int
.
Come notato nella risposta di Julien, questo utilizza un formattatore statico per motivi di prestazioni.
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)) ?? ""
}
}
Per usarlo:
let number = 31908551587
print(number.delimiter) // 31,908,551,587
internal var
e tu hai e bastavar
. Cosa aggiunge la tua risposta alla conversazione? Inoltre, direi che la tua variabile delimiter
è fuorviante. Quella di Julien commaRepresentation
è molto più utile.
Questo è un modo aggiuntivo per impostare la posizione della virgola. Diciamo che voglio che il numero 10000000 venga stampato come "1,00,00,000"
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.groupingSize = 3
numberFormatter.secondaryGroupingSize = 2
numberFormatter.string(from: 10000000)
Ho creato una classe per il campo di testo importo. Impostalo semplicemente sulla classe del campo di testo. Ex- Immettere 1234567. Lo convertirà in 1.234.567 Funziona anche per l'immissione decimale, richiederà due cifre dopo i decimali.
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)
}}