iOS小技能:提取数字(文本框对粘贴内容进行手机号码提取)

2022-08-22 11:33:20 浏览数 (1)

前言

使用手机进行登录注册的时候,需要对粘贴的内容进行手机号码提取。

应用场景:登陆界面、注册界面

文本输入框对手机号码的处理逻辑:

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时进行提取

  • 监听文本改变
代码语言:javascript复制
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewEditChanged:) name:UITextFieldTextDidChangeNotification object:_textF];

  • textViewEditChanged
代码语言:javascript复制

// 监听文本改变
-(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
代码语言:javascript复制
- (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 手机号码

文本输入框对手机号码的处理逻辑:

1 推荐对粘贴内容进行提取设置 2、键盘为UIKeyboardTypeNumberPad即可 3、提交数据之前才进行正则的校验(或者只判断是否长度为11)

代码语言:javascript复制
//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在正则表达式的应用】

0 人点赞