如何在用户输入字符和防止无效字符时测试字符输入到UITextField

Sea*_*mus 12 validation user-input uitextfield ios

首先,我为UITextField设置键盘以使用带小数形式的数字.因此用户只能输入数字和一个小数.

我想要做的是在用户输入时测试输入并防止输入多个小数,并将数字的小数部分限制为两个位置.我不想将数字四舍五入,甚至不将输入视为数字.我只是想阻止用户输入小数点右边的两位数.

Sea*_*mus 45

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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


Vla*_*yuk 5

好!如果有人需要它使用非美国货币:欧元或其他分数用逗号而不是点分隔的那个使用这个:

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

唯一的区别是它允许使用逗号或点.([\,\.] - 或.或者)只有技巧是你需要在使用获取的数字时用点替换逗号,因为计算机使用点来分隔分数而不是逗号.