使用 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 != "")
    }
}