前言
使用手机进行登录注册的时候,需要对粘贴的内容进行手机号码提前
- 应用场景: 登陆界面、注册界面
I、实现细节
文本输入框对手机号码的处理逻辑:
- 推荐对粘贴内容进行提取设置
- 键盘为UIKeyboardTypeNumberPad即可
- 提交数据之前才进行正则的校验(或者只判断是否长度为11)‘
1.1. 提取手机号码
从字符串中提取数字即手机号
invertedSet方法是去反字符,把所有的除了@"0123456789"里的字符都找出来(包含去空格功能)替换成""
+(NSString*)getPhoneNoWithLength:(NSInteger)length WithStr:(NSString*)truePhone{ truePhone = [truePhone stringByReplacingOccurrencesOfString:@"+86" withString:@""]; //从原文查看完成代码 if(truePhone.length<=length){//11 return truePhone; }else{ return [truePhone substringToIndex:length]; } }
- 原文
1.2 在textViewEditChanged时进行提取
- 监听文本改变
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewEditChanged:) name:UITextFieldTextDidChangeNotification object:_textF];
- textViewEditChanged
// 监听文本改变 -(void)textViewEditChanged:(NSNotification *)obj{ UITextField *textField = (UITextField *)obj.object; if ([textField.placeholder containsString:@"手机号"] || self.model.type == UserEnterViewType4PhoneNO) { //登录界面的【请输入手机号】文本框,对粘贴内容进行格式判断:经过前后空格处理之后,只有当内容为11位数以内的数字才可以进行粘贴成功。 textField.text = [textField.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; textField.text = [QCT_Common getPhoneNoWithLength:11 WithStr:textField.text]; } }
1.3 限制只输入11位的数字
- shouldChangeCharactersInRange
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if ([textField.placeholder containsString:@"手机号"] || self.model.type == UserEnterViewType4PhoneNO) { if (range.location > 10) { return NO; } // 处理 string 18621521630 复制的情况 //(lldb) po range.location // <nil> // (lldb) po string.length // 13 return YES; }else{ /////.... return YES; } }
II、文本输入框的格式规则检验
/** 文本输入框的格式规则检验: 比如支付密码、金额格式 // 限制金额 // return [QCT_Common isAmoutshouldChangeCharactersInRange:str]; // 限制支付密码 // return [QCT_Common isPWDChangeCharactersInRange:str]; // 短信验证码 return [QCT_Common isSMSshouldChangeCharactersInRange:str]; // 手机号码: qct_valiMobile */ @property (nonatomic, copy) BOOL (^shouldChangeCharactersInRangeblock)(NSString * str);
2.1 金额格式
+ (BOOL)isAmoutshouldChangeCharactersInRange:(NSString*)str{ //匹配以0开头的数字 NSPredicate * predicate0 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",@"^[0][0-9]+$"]; //匹配两位小数、整数 NSPredicate * predicate1 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",@"^(([1-9]{1}[0-9]*|[0])\.?[0-9]{0,2})$"]; return ![predicate0 evaluateWithObject:str] && [predicate1 evaluateWithObject:str] ? YES : NO; }
2.2 支付密码/短信验证码
+ (BOOL)isPWDChangeCharactersInRange:(NSString*)str{ NSPredicate * predicate0 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",@"^[0-9]{0,6}$"]; return [predicate0 evaluateWithObject:str] ; }
2.3 手机号码
文本输入框对手机号码的处理逻辑:
- 推荐对粘贴内容进行提取设置
- 键盘为UIKeyboardTypeNumberPad即可
- 提交数据之前才进行正则的校验(或者只判断是否长度为11)
//UIKeyboardTypeNumberPad + (BOOL)isphoneNoshouldChangeCharactersInRange:(NSString *)mobile { if (mobile.length <= 11) { return YES; }else{ return NO; } }
正则匹配手机号
#pragma 正则匹配手机号 + (BOOL)checkTelNumber:(NSString *) telNumber { NSString *pattern = @^1+[3578]+\d{9}; NSPredicate *pred = [NSPredicate predicateWithFormat:@SELF MATCHES %@, pattern]; BOOL isMatch = [pred evaluateWithObject:telNumber]; return isMatch; } ————————————————
NSPredicate在正则表达式的应用:https://blog.csdn.net/z929118967/article/details/115505524
III 商户进件基本信息条件限制
3.1 “•”特殊字符处理
把大的圆点替换成英文半角的小圆点
新疆或外国人姓名中间有间隔符”·“,如迪巴·迪力木拉提,代理商经常将”·“输错为“•”
if( [_frNameTextF.text containsString:@"•"]) { // return [SVProgressHUD showInfoWithStatus:@"法人姓名有误"]; _frNameTextF.text = [_frNameTextF.text stringByReplacingOccurrencesOfString:@"•" withString:@"·"];//替换字符 }
3.2 详细地址限制10-100 个字符
1个汉字算2个字符
CGFloat adressTextVCount = [ControlManager TextCountWithStr:_adressTextV.text]; if (adressTextVCount < 5 || adressTextVCount > 50 ) { return [SVProgressHUD showInfoWithStatus:@"商户详细地址限制10-100 个字符"]; }
计算个数
+ (CGFloat)TextCountWithStr:(NSString *)s { // NSInteger MaxNumberOfDescriptionChars = _model.titleMaxCount; int i;CGFloat n=[s length],l=0,a=0,b=0; CGFloat wLen=0; unichar c; for(i=0;i<n;i++){ c=[s characterAtIndex:i];//按顺序取出单个字符 if(isblank(c)){//判断字符串为空或为空格 b++; }else if(isascii(c)){ a++; }else{ l++; } wLen=l+(CGFloat)((CGFloat)(a+b)/2.0); // NSLog(@"wLen--%f",wLen); // if (wLen>=MaxNumberOfDescriptionChars-0.5&&wLen<MaxNumberOfDescriptionChars+0.5) {//设定这个范围是因为,当输入了15英文,即7.5个字符,后面还能输1字母,但不能输1中文 // _subLength=l+a+b;//_subLen是要截取字符串的位置 // } } if(a==0 && l==0) { // _subLength=0; return 0;//只有isblank } else{ return wLen;//长度,中文占1,英文等能转ascii的占0.5 } }