关闭

验证身份证号和NSScanner的使用

140人阅读 评论(0) 收藏 举报
分类:

//验证身份证号是否正确(简单):

+ (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;

}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:37167次
    • 积分:934
    • 等级:
    • 排名:千里之外
    • 原创:45篇
    • 转载:73篇
    • 译文:0篇
    • 评论:8条
    文章分类
    最新评论