使用NumberFormatter()的.currency格式时,无法填充UITextField

时间:2017-11-23 03:56:47

标签: ios swift uitextfield nsnumberformatter

我从SO中借用并修改了一些代码,以解决我尝试格式化我输入UITextField的文本的问题。如果我使用.decimal numberStyle NumberFormatter它可以使用(在我需要的地方添加逗号),但如果我使用.currency我就无法输入任何内容运行应用程序。 <{1}}不会填充。

我尝试过使用该语言环境,但似乎无法解决任何问题。

我想做的就是向用户显示&#34; $&#34;一旦他们开始输入UITextField

,就会在他们输入的号码前签名

无论是否使用UITextField扩展程序,都可以这样做,因此似乎不会导致它。

相关代码:

digitsOnly

2 个答案:

答案 0 :(得分:0)

在您的扩展程序中试用此代码并将其与newString和currencyCode(例如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
    }

答案 1 :(得分:0)

在文本字段委托中尝试此操作。

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 = "$0.00"
        }
    }
    return false
}
extension String {

    func isValidCharacterForCurrency() -> Bool {

        let intValue = Int(self)
        return !(intValue == 0 && self != "0" && self != "")
    }
}