Ios 创建具有有限数字和小数位数的自定义UITextField

Ios 创建具有有限数字和小数位数的自定义UITextField,ios,swift,uitextfield,decimal,numberformatter,Ios,Swift,Uitextfield,Decimal,Numberformatter,我正在尝试创建一个只能接受数字的自定义UITextField,但逗号后的数字数量有限。 因此,如果用户键入: 0 -> 0 10 -> 10 10,0 -> 10,0 1000 -> 1.000 0,1 -> 0,1 0,00000008 -> 0,00000008 1,000006 -> 1,000006 10000,12345678 -> 10.000,12345678 用户必须输入逗号,以便计算逗号后的数字,但如果用户不键入逗号,则它始终是

我正在尝试创建一个只能接受数字的自定义UITextField,但逗号后的数字数量有限。 因此,如果用户键入:

0 -> 0
10 -> 10
10,0 -> 10,0
1000 -> 1.000
0,1 -> 0,1
0,00000008 -> 0,00000008
1,000006 -> 1,000006
10000,12345678 -> 10.000,12345678
用户必须输入逗号,以便计算逗号后的数字,但如果用户不键入逗号,则它始终是一个整数。逗号后的最大字符数为8

已尝试使用某些textField委托方法,但未成功:

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

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

    if isNumeric {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        formatter.maximumFractionDigits = 8
        formatter.groupingSeparator = "."
        formatter.decimalSeparator = ","

        if let groupingSeparator = formatter.groupingSeparator {

            if string == groupingSeparator {
                return true
            }

            if let textWithoutGroupingSeparator = textField.text?.replacingOccurrences(of: groupingSeparator, with: "") {
                var totalTextWithoutGroupingSeparators = textWithoutGroupingSeparator + string
                if string.isEmpty {
                    totalTextWithoutGroupingSeparators.removeLast()
                }
                if let numberWithoutGroupingSeparator = formatter.number(from: totalTextWithoutGroupingSeparators),
                    let formattedText = formatter.string(from: numberWithoutGroupingSeparator) {

                    textField.text = formattedText
                    return false
                }
            }
        }
    }

    return true
}

我使用了下面的代码。检查一下你是否发现这个有用

// MARK:- TEXTFIELD DELEGATE
func textField(_ textField: UITextField,shouldChangeCharactersIn range: NSRange,replacementString string: String) -> Bool
{
    let countdots = (txf_Amount.text?.components(separatedBy: ".").count)! - 1

    if countdots > 0 && string == "."
    {
        return false
    }

    let MAX_BEFORE_DECIMAL_DIGITS = 10
    let MAX_AFTER_DECIMAL_DIGITS = 3
    let computationString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
    // Take number of digits present after the decimal point.
    let arrayOfSubStrings = computationString.components(separatedBy: ".")

    if arrayOfSubStrings.count == 1 && computationString.count > MAX_BEFORE_DECIMAL_DIGITS {
        return false
    } else if arrayOfSubStrings.count == 2 {
        let stringPostDecimal = arrayOfSubStrings[1]
        return stringPostDecimal.count <= MAX_AFTER_DECIMAL_DIGITS
    }

    return true

}
//标记:-TEXTFIELD委托
func textField(textField:UITextField,shouldChangeCharacters范围:NSRange,replacementString:string)->Bool
{
让countdots=(txf_Amount.text?.components(以“.”分隔)。count)!-1
如果countdots>0&&string==”
{
返回错误
}
设小数位数前的MAX=10
设小数位数后的MAX=3
让计算字符串=(textField.text!作为NSString)。replacingCharacters(在:范围内,使用:字符串)
//取小数点后的位数。
让arrayOfSubStrings=computationString.components(以“.”分隔)
如果arrayOfSubStrings.count==1&&computationString.count>MAX\u在十进制数字之前{
返回错误
}如果arrayOfSubStrings.count==2,则为else{
设stringPostDecimal=ArrayOfSubString[1]

return stringPostDecimal.count给我们反馈很好它工作得很好,但是分组分隔符作为“.”或“,”不起作用