您的位置:首页 > 其它

验证身份证号和NSScanner的使用

2016-06-01 18:08 232 查看
//验证身份证号是否正确(简单):

+ (BOOL)isIdentityCardRightful: (NSString *)idCard

{

    if (idCard.length <=
0) {

        return NO;

    }

    

    NSString * regex =
@"^(\\d{14}|\\d{17})(\\d|[xX])$";

    NSPredicate * idCardPredicate = [NSPredicate
predicateWithFormat:@"SELF MATCHES %@",regex];

    BOOL isMatch = [idCardPredicate
evaluateWithObject:idCard];

    return isMatch;

}

// 身份证识别(全面)

+(BOOL)checkIdentityCardNo:(NSString*)cardNo

{

    if (cardNo.length !=
18) {

        return  NO;

    }

    

    if (![self
isIdentityCardRightful:cardNo]) {

        return NO;

    }

    

    NSString * cardNOUPStr = cardNo.uppercaseString;

    

    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:[cardNOUPStr
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+=[[cardNOUPStr substringWithRange:NSMakeRange(i ,
1) ] intValue]* [[codeArray
objectAtIndex:i] intValue];

    }

    

    NSString* strlast = [checkCodeDic
objectForKey:[NSString
stringWithFormat:@"%d",sumValue%11]];

    

    if ([strlast
isEqualToString:[[cardNOUPStr substringWithRange:NSMakeRange(17,
1)]uppercaseString]]) {

        return YES;

    }

    return 
NO;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: