我想在 ios Swift3 的 UITextField 中动态插入一个逗号

I want to dynamically insert a comma into UITextField for ios Swift3

尝试使用 NumberFormat 更改 UITextField 的字符失败。

数量:1000000.00

结果:

如何转换?

这是我失败的代码。

public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

if ((string == "0" || string == "") && (textField.text! as NSString).range(of: ".").location < range.location) {
    return true
}

let cs = NSCharacterSet(charactersIn: "0123456789.").inverted
let filtered = string.components(separatedBy: cs)
let component = filtered.joined(separator: "")
let isNumeric = string == component

if isNumeric {
    let formatter = NumberFormatter()
    formatter.numberStyle = .decimal
    formatter.maximumFractionDigits = 0

    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 {
        var formattedString = formatter.string(from: number!)

        if string == "." && range.location == textField.text?.characters.count {
            formattedString = formattedString?.appending(".")
        }

        /* // Fail...
        if length! > 1 { 
            formattedString?.insert(",", at: (formattedString?.index((formattedString?.endIndex)!, offsetBy: -1))!) 
        }
        */

        textField.text = formattedString
    } else {
        textField.text = nil
    }
}
return false

}

对货币格式文本使用 Numberformatter

var formatter = NSNumberFormatter()
formatter.numberStyle = NSNumberFormatterCurrencyStyle
formatter.locale = NSLocale.currentLocale()
print("\(formatter.stringFromNumber(number)!)")
let number = 1000000.00
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = NumberFormatter.Style.decimal
numberFormatter.string(from: NSNumber(value: number))

let str  =  numberFormatter.string(from: NSNumber(value: number))
print (str is ---%@",str)
output ---> 1,000,000
func textFieldDidEndEditing(textField: UITextField) {
        var value = textField.text
        var components = value.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "1234567890,.").invertedSet)
        var decimalString = "".join(components) as NSString

        let number = NSDecimalNumber(string: decimalString, locale:NSLocale.currentLocale())

        var formatter = NSNumberFormatter()
        formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
        formatter.locale = NSLocale.currentLocale()

        if let formatedValue = formatter.stringFromNumber(number) {
            textField.text = formatedValue
        }
        else {
            textField.text = ""
        }
}

我已经用下面的代码解决了。

if ((string == "0" || string == "") && (textField.text! as NSString).range(of: ".").location < range.location) {
                return true
            }

            let cs = NSCharacterSet(charactersIn: "0123456789.").inverted
            let filtered = string.components(separatedBy: cs)
            let component = filtered.joined(separator: "")
            let isNumeric = string == component

            if isNumeric {
                let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
                let numberWithOutCommas = newString.replacingOccurrences(of: ",", with: "")

                var charSum = 1;

                var resultStr: String = ""

                for (_, element) in numberWithOutCommas.characters.reversed().enumerated() {
                    resultStr.append(element)
                    if charSum % 3 == 1 {
                        resultStr.append(",")
                    }
                    charSum += 1
                }

                var str = String(resultStr.characters.reversed())

                if str.characters.count > 0 {
                    if str[str.startIndex] == "," {
                        str.remove(at: str.startIndex)
                    }
                }
                textField.text = str
            }
            return false