使用 NumberFormatter() 的 .currency 格式时无法填充 UITextField
Can't get UITextField to populate when using .currency format of NumberFormatter()
我从 SO 借用并修改了一些代码来解决我试图格式化输入到我的 UITextField
中的文本的问题。如果我使用 NumberFormatter
的 .decimal
numberStyle
它可以工作(在我需要的地方添加一个逗号)但是如果我使用 .currency
我一旦我 运行 应用程序。 UITextField
不会填充。
我试过使用语言环境,但似乎没有解决任何问题。
我想做的就是在用户开始输入 UITextField
时立即在他们输入的数字前面显示“$”符号
无论是否使用我正在使用的 digitsOnly
扩展程序,它都会这样做,所以这似乎不是导致它的原因。
相关代码:
case annualBill!:
if isNumeric {
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.currencySymbol = "$"
let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
let numberWithOutCommas = newString.replacingOccurrences(of: ",", with: "")
let number = formatter.number(from: numberWithOutCommas)
if number != nil {
let formattedString = formatter.string(from: number!)
textField.text = formattedString
values.annualBill = Decimal(string: (textField.text?.digitsOnly)!)
print(values.annualBill ?? "NA")
} else {
textField.text = nil
}
extension String {
var digitsOnly: String {
return components(separatedBy:
NSCharacterSet.decimalDigits.inverted).joined(separator: "")
}
}
在您的扩展程序中尝试此代码并将其与您的 newString
和货币代码(例如 USD
)一起使用,最好与 number with decimal
键盘一起使用,这样您就不需要检查预先格式化
public func toCurrencyFormatter(with currencyCode: String) -> String {
if NSDecimalNumber(string: self) != NSDecimalNumber.notANumber {
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.currencyCode = currencyCode
guard let formattedStr = formatter.string(from: NSDecimalNumber(string: self)) else { return self }
return formattedStr
}
return self
}
在您的文本字段委托中试试这个。
var amountString = ""
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if !string.isValidCharacterForCurrency() {
return false
}
let formatter = NumberFormatter()
formatter.minimumFractionDigits = 2
formatter.maximumFractionDigits = 2
if string.count > 0 {
amountString += string
let decNumber = NSDecimalNumber(string: amountString).multiplying(by: 0.01)
let newString = "$" + formatter.string(from: decNumber)!
textField.text = newString
}
else {
amountString = String(amountString.dropLast())
if amountString.count > 0 {
let decNumber = NSDecimalNumber(string: amountString).multiplying(by: 0.01)
let newString = "$" + formatter.string(from: decNumber)!
textField.text = newString
}
else {
textField.text = "[=10=].00"
}
}
return false
}
extension String {
func isValidCharacterForCurrency() -> Bool {
let intValue = Int(self)
return !(intValue == 0 && self != "0" && self != "")
}
}
我从 SO 借用并修改了一些代码来解决我试图格式化输入到我的 UITextField
中的文本的问题。如果我使用 NumberFormatter
的 .decimal
numberStyle
它可以工作(在我需要的地方添加一个逗号)但是如果我使用 .currency
我一旦我 运行 应用程序。 UITextField
不会填充。
我试过使用语言环境,但似乎没有解决任何问题。
我想做的就是在用户开始输入 UITextField
无论是否使用我正在使用的 digitsOnly
扩展程序,它都会这样做,所以这似乎不是导致它的原因。
相关代码:
case annualBill!:
if isNumeric {
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.currencySymbol = "$"
let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
let numberWithOutCommas = newString.replacingOccurrences(of: ",", with: "")
let number = formatter.number(from: numberWithOutCommas)
if number != nil {
let formattedString = formatter.string(from: number!)
textField.text = formattedString
values.annualBill = Decimal(string: (textField.text?.digitsOnly)!)
print(values.annualBill ?? "NA")
} else {
textField.text = nil
}
extension String {
var digitsOnly: String {
return components(separatedBy:
NSCharacterSet.decimalDigits.inverted).joined(separator: "")
}
}
在您的扩展程序中尝试此代码并将其与您的 newString
和货币代码(例如 USD
)一起使用,最好与 number with decimal
键盘一起使用,这样您就不需要检查预先格式化
public func toCurrencyFormatter(with currencyCode: String) -> String {
if NSDecimalNumber(string: self) != NSDecimalNumber.notANumber {
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.currencyCode = currencyCode
guard let formattedStr = formatter.string(from: NSDecimalNumber(string: self)) else { return self }
return formattedStr
}
return self
}
在您的文本字段委托中试试这个。
var amountString = ""
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if !string.isValidCharacterForCurrency() {
return false
}
let formatter = NumberFormatter()
formatter.minimumFractionDigits = 2
formatter.maximumFractionDigits = 2
if string.count > 0 {
amountString += string
let decNumber = NSDecimalNumber(string: amountString).multiplying(by: 0.01)
let newString = "$" + formatter.string(from: decNumber)!
textField.text = newString
}
else {
amountString = String(amountString.dropLast())
if amountString.count > 0 {
let decNumber = NSDecimalNumber(string: amountString).multiplying(by: 0.01)
let newString = "$" + formatter.string(from: decNumber)!
textField.text = newString
}
else {
textField.text = "[=10=].00"
}
}
return false
}
extension String {
func isValidCharacterForCurrency() -> Bool {
let intValue = Int(self)
return !(intValue == 0 && self != "0" && self != "")
}
}