ios – 如何在用户输入字符并防止无效字符时测试UITextField的字符输入

首先,我设置UITextField的键盘以使用带小数风格的数字.所以用户只能输入数字和一个小数.

我想做的是测试用户输入的输入,并防止输入多个小数,并将数字的小数部分限制在两个位置.我不想舍弃数字,也不想把输入视为一个数字.我只想阻止用户输入小数点右边的两位数字.

解决方法

解决方案最终变得相当微不足道.不幸的是,与此问题相关的许多问题和答案都是验证或格式化数值,而不是控制用户可以输入的内容.

以下实现的shouldChangeCharactersInRange代理方法是我的解决方案.与往常一样,正则表达式在这种情况下摇滚. RegExLib.com是有用的RegEx样品或解决方案的绝佳来源.我不是RegEx大师,总是努力把它们放在一起,所以任何改进建议都是值得欢迎的.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField == self.quantityTextField)
    {
        NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];

        NSString *expression = @"^([0-9]+)?(\\.([0-9]{1,2})?)?$";

        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression 
                                                                               options:NSRegularExpressionCaseInsensitive 
                                                                                 error:nil];
        NSUInteger numberOfMatches = [regex numberOfMatchesInString:newString
                                                            options:0
                                                              range:NSMakeRange(0,[newString length])];        
        if (numberOfMatches == 0)
            return NO;        
    }

    return YES;
}

上述代码允许用户输入这些值:1,1.1,1.11,.1,.11.请注意,此实现不会替换文本字段的字符串,这将导致递归.如果’newString’与正则表达式不匹配,则此解决方案只会拒绝用户输入的下一个字符.

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...