前言
使用手机进行登录注册的时候,需要对粘贴的内容进行手机号码提取。
应用场景:登陆界面、注册界面
文本输入框对手机号码的处理逻辑:
1、推荐对粘贴内容进行提取设置 2、键盘为UIKeyboardTypeNumberPad即可 3、提交数据之前才进行正则的校验(或者只判断是否长度为11)
I、实现细节
1.1. 提取手机号码
代码语言:javascript复制 (NSString*)getPhoneNoWithLength:(NSInteger)length WithStr:(NSString*)truePhone{
truePhone = [truePhone stringByReplacingOccurrencesOfString:@" 86" withString:@""];
// 从字符串中提取数字即手机号的方法: //invertedSet方法是去反字符,把所有的除了@"0123456789"里的字符都找出来(包含去空格功能)替换成""
truePhone = [[truePhone componentsSeparatedByCharactersInSet:[[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet]] componentsJoinedByString:@""];
if(truePhone.length<=length){//11
return truePhone;
}else{
return [truePhone substringToIndex:length];
}
}
用法
代码语言:javascript复制 // 提取手机号 isgetPhone
if(self.model.isgetPhone){
textField.text = [textField.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
textField.text = [QCT_Common getPhoneNoWithLength:11 WithStr:textField.text];
}
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;
}
}
正则:11位的数字
代码语言:javascript复制#pragma 正则,11位的数字
(BOOL)checkEmployeeNumber: (NSString *) number
{
NSString *pattern = @"^[0-9]{11}";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
BOOL isMatch = [pred evaluateWithObject:number];
return isMatch;
}
II、文本输入框的格式规则检验
代码语言:javascript复制/**
文本输入框的格式规则检验: 比如支付密码、金额格式
// 限制金额
// 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 金额格式
代码语言:javascript复制 (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 支付密码/短信验证码
代码语言:javascript复制 (BOOL)isPWDChangeCharactersInRange:(NSString*)str{
NSPredicate * predicate0 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",@"^[0-9]{0,6}$"];
return [predicate0 evaluateWithObject:str] ;
}
2.3 手机号码
文本输入框对手机号码的处理逻辑:
代码语言:javascript复制1 推荐对粘贴内容进行提取设置 2、键盘为UIKeyboardTypeNumberPad即可 3、提交数据之前才进行正则的校验(或者只判断是否长度为11)
//UIKeyboardTypeNumberPad
(BOOL)isphoneNoshouldChangeCharactersInRange:(NSString *)mobile
{
if (mobile.length <= 11)
{
return YES;
}else{
return NO;
}
}
正则匹配手机号
代码语言:javascript复制#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;
}
————————————————
III 商户进件基本信息条件限制
3.1 “•”特殊字符处理
把大的圆点替换成英文半角的小圆点
代码语言:javascript复制新疆或外国人姓名中间有间隔符”·“,如迪巴·迪力木拉提,代理商经常将”·“输错为“•”
if( [_frNameTextF.text containsString:@"•"]) {
// return [SVProgressHUD showInfoWithStatus:@"法人姓名有误"];
_frNameTextF.text = [_frNameTextF.text stringByReplacingOccurrencesOfString:@"•" withString:@"·"];//替换字符
}
3.2 详细地址限制10-100 个字符
1个汉字算2个字符
代码语言:javascript复制
CGFloat adressTextVCount = [ControlManager TextCountWithStr:_adressTextV.text];
if (adressTextVCount < 5 || adressTextVCount > 50 ) {
return [SVProgressHUD showInfoWithStatus:@"商户详细地址限制10-100 个字符"];
}
计算个数
代码语言:javascript复制
(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
}
}
see also
- iOS短信验证码的Checklist、格式校验、获取验证码处理流程(限制60s):https://kunnan.blog.csdn.net/article/details/104215486
- iOS Predicate Format String Syntax 【NSPredicate在正则表达式的应用】