携手创造,一起生长!这是我参加「日新计划 8 月更文挑战」的第16天,点击查看活动概况
前语
运用手机进行登录注册的时候,需要对张贴的内容进行手机号码提取。
使用场景: 登陆界面、注册界面
文本输入框对手机号码的处理逻辑:
1、引荐对张贴内容进行提取设置 2、键盘为UIKeyboardTypeNumberPad即可 3、提交数据之前才进行正则的校验(或许只判别是否长度为11)
I、实现细节
1.1. 提取手机号码
+(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];
}
}
用法
// 提取手机号 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位的数字
#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、文本输入框的格局规则查验
/**
文本输入框的格局规则查验: 比如付出暗码、金额格局
// 约束金额
// 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 手机号码
文本输入框对手机号码的处理逻辑:
1 \引荐对张贴内容进行提取设置 2、键盘为UIKeyboardTypeNumberPad即可 3、提交数据之前才进行正则的校验(或许只判别是否长度为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;
}
————————————————
版权声明:本文为CSDN博主「#公众号:iOS逆向」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:blog.csdn.net/z929118967/…
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
}
}
see also
-
iOS短信验证码的Checklist、格局校验、获取验证码处理流程(约束60s):https://kunnan.blog.csdn.net/article/details/104215486
-
iOS Predicate Format String Syntax 【NSPredicate在正则表达式的使用】
版权声明:本文为CSDN博主「#公众号:iOS逆向」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:blog.csdn.net/z929118967/…