UITextField中的动态货币-Swift 3

UITextField中的动态货币-Swift 3,swift,xcode,formatter,Swift,Xcode,Formatter,我有这段代码,来自GitHub和一些StackOverflow帖子 extension String { // formatting text for currency textField func currencyInputFormatting() -> String { var number: NSNumber! let formatter = NumberFormatter() formatter.numberSty

我有这段代码,来自GitHub和一些StackOverflow帖子

extension String {

    // formatting text for currency textField
    func currencyInputFormatting() -> String {

        var number: NSNumber!
        let formatter = NumberFormatter()
        formatter.numberStyle = .currencyAccounting
        formatter.currencySymbol = "$"
        formatter.maximumFractionDigits = 2
        formatter.minimumFractionDigits = 2

        var amountWithPrefix = self

        // remove from String: "$", ".", ","
        let regex = try! NSRegularExpression(pattern: "[^0-9]", options: .caseInsensitive)
        amountWithPrefix = regex.stringByReplacingMatches(in: amountWithPrefix, options: NSRegularExpression.MatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count), withTemplate: "")

        let double = (amountWithPrefix as NSString).doubleValue
        number = NSNumber(value: (double / 100))

        // if first number is 0 or all numbers were deleted
        guard number != 0 as NSNumber else {
            return ""
        }

        return formatter.string(from: number)!
    }
}
我使用此扩展可以在用户输入时在UI文本字段中动态创建货币格式。 它工作正常,但我无法删除我写的内容。 我必须手动将光标拖动到要删除的位置,否则它将无法工作。
为什么会发生这种情况

我试图用这种方式添加侦听器

textfield.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
func textFieldDidChange(_ textField: UITextField) {
    let cur = textField.text!.currencyInputFormatting()
    textField.text = cur
}
并以这种方式运行您的函数

textfield.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
func textFieldDidChange(_ textField: UITextField) {
    let cur = textField.text!.currencyInputFormatting()
    textField.text = cur
}

一切正常。我可以从末尾删除我的输入,只要我有一个数字,格式仍然有效。因此,在对文本字段执行设置文本操作后,光标将自动移动到字符串的末尾,因此您只能从末尾删除字符。如果要删除任何其他字符,只需像在笔记本中编辑文本时那样拖动光标。

我尝试过用这种方式添加侦听器

textfield.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
func textFieldDidChange(_ textField: UITextField) {
    let cur = textField.text!.currencyInputFormatting()
    textField.text = cur
}
并以这种方式运行您的函数

textfield.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
func textFieldDidChange(_ textField: UITextField) {
    let cur = textField.text!.currencyInputFormatting()
    textField.text = cur
}

一切正常。我可以从末尾删除我的输入,只要我有一个数字,格式仍然有效。因此,在对文本字段执行设置文本操作后,光标将自动移动到字符串的末尾,因此您只能从末尾删除字符。如果要删除任何其他字符,只需像编辑笔记本中的文本一样拖动光标。

因此,这只是一个字符串扩展代码,用于进行转换。我认为,删除问题是由您使用它的方式造成的。您的文本字段中是否有文本更改侦听器,并调用此方法,然后设置文本?或者如何准确地使用这段代码?我使用func mytextfielddichange(textField:UITextField){if let amountString=textField.text?.currencyInputFormatting(){textField.text=amountString}}与GitHub上的示例完全相同,然后使用此函数为事件向textField添加一个目标“.editingChanged”所以这只是一个进行转换的字符串扩展代码。我认为删除问题是由您使用它的方式造成的。您的文本字段中是否有文本更改侦听器,并调用此方法然后设置文本?或者您如何准确地使用此代码?我使用func myTextFieldDidChange(u.textField:UITextField){如果让amountString=textField.text?.currencyInputFormatting(){textField.text=amountString}}与GitHub上的示例完全相同,那么我将使用此函数为事件“.editingChanged”向textField添加一个目标"我在模拟器上看到它工作,但在我的iPhone上不工作。@Glatteisen,这是有线的。你的iPhone上发生了什么事?光标消失了还是什么?在模拟器中,它看起来像这样,在我的iPhone上工作2131231.23美元,看起来像这个2.131.231,23美元。可能是因为我在德国?所以由于我的位置,格式化程序适应Ger男子货币拼写?在德国,我们把货币符号写在数字的末尾,而不是数字的末尾beginning@Glatteisen是的。如果是这样,这就解释了。因此,当你从末尾删除时,你删除了$mark,然后你的方法将该标记添加回并再次设置文本。这就是你无法删除文本的原因。因此,我们的选项是1。将$放置为label,永远不要改变它。2.如果你确定在设置文本后,$始终在最后,我们可以设置光标位置。我在模拟器上看到它工作,但在我的iPhone上不工作。@Glatteisen,这是有线的。你的iPhone上发生了什么事?光标消失了还是什么?在模拟器中,它看起来像这样,在我的iPhone上工作$2131231.23 |电话,看起来像是2.131.231,23$;可能是因为我在德国?因此,由于我的位置,格式化程序适应德语货币拼写?在德国,我们将货币符号写在数字的末尾,而不是数字的末尾beginning@Glatteisen是的。如果是这样,这就解释了。所以当你从末尾删除时,你删除了$mark和t当您的方法添加该标记并再次设置文本时。这就是您无法删除文本的原因。因此,我们的选项是:1.将$作为标签,并且永远不要更改该标签。2.如果您确定$始终位于最后,在设置文本后,我们可以设置光标位置。