Форматирование UITextField как цены (XXX,XXX.XX)
Я рвал на себе волосы, пытаясь найти решение этой проблемы.
Я просто хочу, чтобы UITextField правильно форматировал введенное число как цену. Это означает, что допускается только одна десятичная точка, две цифры после точки (если они были введены) и "," для разделения больших чисел (например, 150 000).
Вот как цена правильно отформатирована, так почему так сложно получить право?
Самое близкое к этому решение - этот код. Проблема с этим, однако, заключается в том, что после ввода четырех цифр он возвращается к 0?? Это близко к решению, я просто не могу понять, почему так странно.
2 ответа
Вам на самом деле не нужен код для этого. Просто перетащите средство форматирования чисел в текстовое поле в файле пера и настройте его для использования стиля "Валюта".
Через код это будет [myNumberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle]
Помните, что формат цен сильно отличается в зависимости от региона. Например, в Германии точка используется как разделитель тысяч, а запятая - как десятичная точка. Использование стиля вместо фиксированного формата позаботится об этих различиях для вас.
Привет Вот мое решение.
import UIKit
extension Numeric { // for Swift 3 use FloatingPoint or Int
func currency(locale: String, symbol: Bool = true) -> String {
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.locale = Locale(identifier: locale)
if !symbol {
formatter.currencySymbol = ""
}
let result = formatter.string(for: self) ?? ""
return result
}
}
ViewController Code
var price: String!
var priceNumber: CGFloat!
@IBOutlet weak var priceInput: UITextField!
ViewDidLoad
priceInput.addTarget(self, action: #selector(priceInputChanged), for: .editingChanged)
priceInput.tintColor = .clear
priceInput.delegate = self
UITextFieldDelegate в вашем ViewController
@objc func priceInputChanged(_ textField: UITextField){
if localIdentifier != nil {
priceInput.text = priceNumber.currency(locale: localIdentifier, symbol: false)
}
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if textField.tag == 3 {
if string.isEmpty {
if price.count > 0 {
let last = price.removeLast()
if last == "." {
if price.count > 0 {
price.removeLast()
}
}
}
}else {
price.append(string)
}
if let input = price {
let n = NumberFormatter().number(from: input) ?? 0
priceNumber = CGFloat(truncating: n)
if localIdentifier != nil {
priceInput.text = priceNumber.currency(locale: localIdentifier, symbol: false)
}
}
}
return true
}
Вот и все