在此page中,我采用了这段关于在UITextfield中添加货币的代码。
shell=True
}
此代码有两个问题
1-在class CurrencyField: UITextField {
var string: String { return text ?? " " }
var decimal: Decimal {
return string.decimal /
pow(10, Formatter.currency.maximumFractionDigits)
}
var decimalNumber: NSDecimalNumber { return decimal.number }
var doubleValue: Double { return decimalNumber.doubleValue }
var integerValue: Int { return decimalNumber.intValue }
let maximum: Decimal = 999_999_999.99
private var lastValue: String?
override func willMove(toSuperview newSuperview: UIView?) {
// you can make it a fixed locale currency if needed
// Formatter.currency.locale = Locale(identifier: "pt_BR") // or "en_US", "fr_FR", etc
addTarget(self, action: #selector(editingChanged), for: .editingChanged)
keyboardType = .numberPad
textAlignment = .right
editingChanged(self)
}
override func deleteBackward() {
text = string.digits.dropLast().string
editingChanged(self)
}
@objc func editingChanged(_ textField: UITextField) {
guard decimal <= maximum else {
text = lastValue
return
}
text = Formatter.currency.string(for: decimal)
lastValue = text
}
}
extension NumberFormatter {
convenience init(numberStyle: Style) {
self.init()
self.numberStyle = numberStyle
}
}
extension Formatter {
static let currency = NumberFormatter(numberStyle: .currency)
}
extension String {
var digits: String { return filter(("0"..."9").contains) }
var decimal: Decimal { return Decimal(string: digits) ?? 0 }
}
extension Decimal {
var number: NSDecimalNumber { return NSDecimalNumber(decimal: self) }
函数的这一行代码中,有一个我无法解决的错误
deleteBackward()
这是错误:
text = string.digits.dropLast().string
2-这些代码使我们可以在Value of type 'String.SubSequence' (aka 'Substring') has no member 'string'
中添加货币值,我希望当其值为UITextField
时,它在布尔变量中传递true。
我可以这样做:
0.00
但是我认为这不是最好的方法,它可能会导致一些其他错误,您能建议我什么更好的方法吗? 非常感谢