通常在编辑框中输入一些货品数量,金额时,我们都会做一些输入的判断限制。例如不能输入非法字符,只能输入数字等等。现把最近遇到的一些输入限制需求展现如下:
1、 输入小数位不能超过两位;
2、 不能重复输入小数点;
3、 不能输入除数字以外的字符(但不包括退格键,负号键);
4、 限制长度为最小为1,最大为11。
为了实现以上需求,主要是依靠以下UITextFieldDelegate的一个协议方法来实现的:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
功能:
把textField中位置为range的字符串替换为string字符串;
此函数在textField内容被修改时调用;
返回值:
YES,表示修改生效;NO,表示不做修改,textField的内容不变。
参数说明:
textField:响应UITextFieldDelegate协议的UITextField控件。
range: UITextField控件中光标选中的字符串,即被替换的字符串;
range.length为0时,表示在位置range.location插入string。
string: 替换字符串;
string.length为0时,表示点击了删除delete键。
以下所有的代码需要写在该函数中。
1、 输入小数位不能超过两位
/**
* 检查浮点数小数位并校验小数点合法性
*
* @param range 浮点数总长度
* @param dotPlaces 小数位
* @param decimal 浮点数
* @param string 当前输入的数值
*
* @return YES:没有小数点或者限制两位浮点数
NO
*/
+ (BOOL)checkDecimalDotPlaces:(NSRange)range dotPlaces:(NSNumber *)dotPlaces decimal:(NSString *)decimal{
BOOL bHaveDot = false;
if (dotPlaces.integerValue < 0) {
dotPlaces = @0;
}
if ([decimal rangeOfString:@"."].location == NSNotFound){
bHaveDot = false;
}else{
bHaveDot = true;
}
if (bHaveDot) {
//判断小数点的位数
NSRange ran = [decimal rangeOfString:@"."];
if (range.location - ran.location > dotPlaces.integerValue) {
return NO;
}
}
return YES;
}
2、 不能重复输入小数点
//不能再输入小数点
if ([string rangeOfString:@"."].location != NSNotFound && [textField.text rangeOfString:@"."].location == NSNotFound) {
return NO;
}
3、 不能输入除数字以外的字符(但不包括退格键,负号键)
//不能输入字符串
if ([string rangeOfString:@"."].location == NSNotFound) {
NSRange range = [string rangeOfString:@"^[0-9-]+$" options:NSRegularExpressionSearch];
if (range.location == NSNotFound) {
return NO;
}
}
//删除delete键
if ([string isEqualToString:@""]) {
return YES;
}
4、 限制长度为最小为1,最大为11位
NSString *pwdRegex = @"[0-9]{1,10}";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES%@",pwdRegex];
if ([predicate evaluateWithObject:textField.text] || ![textField.text notEmpty]) {
return YES;
}else{
return NO;
}
另外,对于字符串的判断可以选择在NSString的分类扩展里进行设置,如NSString+Extension。
总代码如下:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
//不能再输入小数点
if ([string rangeOfString:@"."].location != NSNotFound && [NSString isHaveDot:textField.text]) {
return NO;
}
//delete
if ([string isEqualToString:@""]) {
return YES;
}
//不能输入字符串
if ([string rangeOfString:@"."].location == NSNotFound) {
NSRange range = [string rangeOfString:@"^[0-9]+$" options:NSRegularExpressionSearch];
if (range.location == NSNotFound) {
return NO;
}
}
//限制长度为最小为1,最大为11位
NSString *pwdRegex = @"[0-9]{1,10}";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES%@",pwdRegex];
if ([predicate evaluateWithObject:textField.text] || ![textField.text notEmpty]) {
return YES;
}else{
return NO;
}
//限制小数位长度不超过2
if (![NSString checkDecimalDotPlaces:range dotPlaces:ZHJFloatDotPlaces decimal:textField.text]) {
return NO;
}
return YES;
}
时间: 2024-10-01 04:47:21