UITextField输入过滤

引子

今儿随便写小demo的时候,想让UITextField过滤掉一些输入的条件,做一个记录,方便以后查阅。

具体要求如下:

  • 只能输入数字;
  • 最多输入两位小数;
  • 最多输入六位整数,且能继续输入两位小数,但不能输入整数;
  • 不能重复输入小数点;
  • 不能在小数点前边输入多个0。

需求解决

首先,应该在哪个方法处理?答案是:
- textField:shouldChangeCharactersInRange:replacementString:
这是一个UITextField的代理方法,关于这个方法,苹果官方文档指出,此乃过滤输入的最好时机:

Discussion
The text field calls this method whenever user actions cause its text to change. Use this method to validate text as it is typed by the user. For example, you could use this method to prevent the user from entering anything but numerical values.

这个方法是当UITextField中的文字要发生改变时调用的。如果返回NO则当前UITextField中的文字将不再响应输入,反之则可以正常响应输入。

1. 输入数字

这个我通过设置键盘类型达到目的(原谅我的机智。。。),当然也可以通过判断输入的字符进行处理。

2. 两位小数

if([textField.text rangeOfString:@"."].location != NSNotFound) 
{
NSUInteger dotLocation = [textField.text rangeOfString:@"."].location;
NSUInteger dotRange = range.location - dotLocation;
if (dotRange <= 2) {
return YES;
}
else
return NO; //最多输入2位小数
}

3. 六位整数

if (range.location >= 6)
{
if ([string isEqualToString:@"."]) {
return YES; //输入6位整数后可以继续输入小数
}
else
return NO; //最多输入6位整数
}

4. 小数点重复

if ([string rangeOfString:@"."].location != NSNotFound && [textField.text rangeOfString:@"."].location != NSNotFound) 
{
return NO; //不能输入多个小数点
}

5. 多个0开头

if (firstChar == '0' && ([textField.text rangeOfString:@"0"].location == 0 && [textField.text rangeOfString:@"."].location != 1))
{
return NO; //不能输入0000,除非是0.xx小数的形式
}

6. 最后整个方法的代码

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSLog(@"%zd===%zd====%@", range.location, range.length, string);
if ([string length] > 0) {
unichar firstChar = [string characterAtIndex:0];
if ([textField.text length] == 0 && firstChar == '.') {
return NO; //不能以.开头
}
if (firstChar == '0' && ([textField.text rangeOfString:@"0"].location == 0 && [textField.text rangeOfString:@"."].location != 1))
{
return NO; //不能输入0000,除非是0.xx小数的形式
}
if ([string rangeOfString:@"."].location != NSNotFound && [textField.text rangeOfString:@"."].location != NSNotFound) {
return NO; //不能输入多个小数点
}
if([textField.text rangeOfString:@"."].location != NSNotFound) {
NSUInteger dotLocation = [textField.text rangeOfString:@"."].location;
NSUInteger dotRange = range.location - dotLocation;
if (dotRange <= 2) {
return YES;
}
else
return NO; //最多输入2位小数
}
if (range.location >= 6) {
if ([string isEqualToString:@"."]) {
return YES; //输入6位整数后可以继续输入小数
}
else
return NO; //最多输入6位整数
}
else
return YES;
}
else
return YES;
}