首先,我设置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’与正则表达式不匹配,则此解决方案只会拒绝用户输入的下一个字符.