iOS 身份证验证(转)

原文地址:http://www.cnblogs.com/yswdarren/p/3559423.html

- (void)onClickButton:(id) sender{
if (tmp_txt.text.length == 15 || tmp_txt.text.length == 18) {                
                NSString *emailRegex = @"^[0-9]*$";
                NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
                bool sfzNo = [emailTest evaluateWithObject:[tmp_txt.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
                
                if (tmp_txt.text.length == 15) {
                    if (!sfzNo) {
                        [self HUDShow:@"请输入正确的身份证号" delay:1.5];                       
                        return NO;
                    }
                }
                else if (tmp_txt.text.length == 18) {                    
                    bool sfz18NO = [Global checkIdentityCardNo:tmp_txt.text];
                    if (!sfz18NO) {
                        [self HUDShow:@"请输入正确的身份证号" delay:1.5];                       
                        return NO;
                    }
                }
            }else{
                [self HUDShow:@"请输入正确的身份证号" delay:1.5];               
                return NO;
            }
}

#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;
}
原文地址:https://www.cnblogs.com/ljios/p/5306769.html