22、[ iOS ] 身份证号校验

作者: 天听云道 | 来源:发表于2016-02-29 21:14 被阅读251次
    /**
    * 功能:身份证号校验
    */   
    // ------确定
    - (void)authClick {
        
        if (![self checkData]) {
            return;
        };
    // 写验证成功后的代码
    }
    - (BOOL)checkData {
        MBProgressHUD *mbhud = [[MBProgressHUD alloc] initWithView:self.view];
        [self.view addSubview:mbhud];
        mbhud.delegate = self;
        mbhud.yOffset = - 50;
        mbhud.mode = MBProgressHUDModeText;
        // 姓名
        if (_name.text.length == 0) {
            mbhud.labelText = @"请输入姓名";
            [mbhud show:YES];
            [mbhud hide:YES afterDelay:1];
            return NO;
        }
    
        // 身份证
        if (_identity.text.length == 0) {
            mbhud.labelText = @"请输入身份证号码";
            [mbhud show:YES];
            [mbhud hide:YES afterDelay:1];
            return NO;
        }
        
        if (_identity.text.length == 15 || _identity.text.length == 18) {
            NSString *emailRegex = @"^[0-9]*$";
            NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
            bool sfzNo = [emailTest evaluateWithObject:[_identity.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
            
            if (_identity.text.length == 15) {
                if (!sfzNo) {
                    mbhud.labelText = @"请输入正确的身份证号";
                    [mbhud show:YES];
                    [mbhud hide:YES afterDelay:1];
                    return NO;
                }
            }
            else if (_identity.text.length == 18) {
                bool sfz18NO = [self checkIdentityCardNo:_identity.text];
                if (!sfz18NO) {
                    mbhud.labelText = @"请输入正确的身份证号";
                    [mbhud show:YES];
                    [mbhud hide:YES afterDelay:1];
                    return NO;
                }
            }
        }else{
            mbhud.labelText = @"请输入正确的身份证号";
            [mbhud show:YES];
            [mbhud hide:YES afterDelay:1];
            return NO;
        }
        
        return YES;
    }
    #pragma mark - 身份证识别
    - (BOOL)checkIdentityCardNo:(NSString*)cardNo
    {
        if (cardNo.length != 18) {
            return  NO;
        }
        NSArray* codeArray = [NSArray arrayWithObjects:@"7",@"9",@"10",@"5",@"8",@"4",@"2",@"1",@"6",@"3",@"7",@"9",@"10",@"5",@"8",@"4",@"2", nil];
        NSDictionary* checkCodeDic = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"1",@"0",@"X",@"9",@"8",@"7",@"6",@"5",@"4",@"3",@"2", nil]  forKeys:[NSArray arrayWithObjects:@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10", nil]];
        
        NSScanner* scan = [NSScanner scannerWithString:[cardNo substringToIndex:17]];
        
        int val;
        BOOL isNum = [scan scanInt:&val] && [scan isAtEnd];
        if (!isNum) {
            return NO;
        }
        int sumValue = 0;
        
        for (int i =0; i<17; i++) {
            sumValue+=[[cardNo substringWithRange:NSMakeRange(i , 1) ] intValue]* [[codeArray objectAtIndex:i] intValue];
        }
        
        NSString* strlast = [checkCodeDic objectForKey:[NSString stringWithFormat:@"%d",sumValue%11]];
        
        if ([strlast isEqualToString: [[cardNo substringWithRange:NSMakeRange(17, 1)]uppercaseString]]) {
            return YES;
        }
        return  NO;
    }
    

    相关文章

      网友评论

      • 我就叫土豆:用个正则表达式不就解决了?
        我就叫土豆:@天听云道
        - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

        NSString *IDCard = @"51130319951123456";
        NSString *IDCardReg = @"^(\\d{15}$|^\\d{18}$|^\\d{17}(\\d|X|x))$";
        NSPredicate *IDCardTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", IDCardReg];
        BOOL flag = [IDCardTest evaluateWithObject:IDCard];
        if (flag == YES) {
        NSLog(@"验证通过!");
        }else {
        NSLog(@"验证不通过");
        }
        }
        天听云道:@我就叫土豆 请教,我也把学学:pray:

      本文标题:22、[ iOS ] 身份证号校验

      本文链接:https://www.haomeiwen.com/subject/gdkwkttx.html