Jak dodać przecinki do liczby, którą w szybki sposób pobieram z JSON.
Example
31908551587 to
31,908,551,587
Jestem taki zdezorientowany i nie mam pojęcia, co robić.
Jak dodać przecinki do liczby, którą w szybki sposób pobieram z JSON.
Example
31908551587 to
31,908,551,587
Jestem taki zdezorientowany i nie mam pojęcia, co robić.
Odpowiedzi:
Możesz to zrobić za pomocą NSNumberFormatter
Szybki 4
let largeNumber = 31908551587
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
let formattedNumber = numberFormatter.string(from: NSNumber(value:largeNumber))
Szybki 3
let largeNumber = 31908551587
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = NumberFormatter.Style.decimal
let formattedNumber = numberFormatter.string(from: NSNumber(value:largeNumber))
Szybki 2
let largeNumber = 31908551587
let numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
let formattedNumber = numberFormatter.stringFromNumber(largeNumber)
Rozszerzając odpowiedź Özgür Ersil, możesz wyodrębnić funkcjonalność poprzez rozszerzenie do Int:
extension Int {
func withCommas() -> String {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
return numberFormatter.string(from: NSNumber(value:self))!
}
}
Aby następnie użyć w swoim kodzie jako:
largeNumber.withCommas()
Rozwijając również odpowiedź Juana Fran Jimeneza, zalecałbym umieszczenie formatera w singletonie, ponieważ tworzenie instancji formatera jest zwykle stosunkowo kosztowną operacją. (Może to wpłynąć na wydajność, jeśli formatujesz w podróży, gdy pisze użytkownik).
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)) ?? ""
}
}
Prosty spadek rozszerzenia, który zapewni zmienną poprzez rozszerzenie Int.
Jak zauważono w odpowiedzi Juliena, ze względu na wydajność wykorzystuje statyczny formatyzator.
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)) ?? ""
}
}
Aby z niego skorzystać:
let number = 31908551587
print(number.delimiter) // 31,908,551,587
internal vara ty po prostu masz var. Co twoja odpowiedź wnosi do rozmowy? Powiedziałbym też, że twoja zmienna delimiterjest myląca. Julien's commaRepresentationjest znacznie bardziej przydatny.
Jest to dodatkowy sposób ustawiania pozycji przecinka. Powiedzmy, że chcę, aby liczba 10000000 została wydrukowana jako „1,00,00 000”
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.groupingSize = 3
numberFormatter.secondaryGroupingSize = 2
numberFormatter.string(from: 10000000)
Utworzyłem klasę dla pola tekstowego kwoty. Po prostu ustaw go na swoją klasę textfield. Np. - Wprowadź 1234567. Przekształci to na 1234,567. Działa również w przypadku wprowadzania dziesiętnego, przyjmuje dwie cyfry po przecinku.
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)
}}