美文网首页
IOS 最严格的身份证号验证

IOS 最严格的身份证号验证

作者: 清蘂翅膀的技术 | 来源:发表于2017-08-05 10:57 被阅读0次

    //身份证号

    + (BOOL)CheckIsIdentityCard: (NSString*)identityCard

    {

    //判断是否为空

    if(identityCard==nil||identityCard.length<=0) {

    returnNO;

    }

    //判断是否是18位,末尾是否是x

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

    NSPredicate*identityCardPredicate = [NSPredicatepredicateWithFormat:@"SELF MATCHES %@",regex2];

    if(![identityCardPredicateevaluateWithObject:identityCard]){

    returnNO;

    }

    //判断生日是否合法

    NSRange range = NSMakeRange(6,8);

    NSString*datestr = [identityCardsubstringWithRange:range];

    NSDateFormatter*formatter = [[NSDateFormatteralloc]init];

    [formatter setDateFormat :@"yyyyMMdd"];

    if([formatterdateFromString:datestr]==nil){

    returnNO;

    }

    //判断校验位

    if(identityCard.length==18)

    {

    NSArray*idCardWi= @[@"7",@"9",@"10",@"5",@"8",@"4",@"2",@"1",@"6",@"3",@"7",@"9",@"10",@"5",@"8",@"4",@"2"];//将前17位加权因子保存在数组里

    NSArray* idCardY=@[@"1",@"0",@"10",@"9",@"8",@"7",@"6",@"5",@"4",@"3",@"2"];//这是除以11后,可能产生的11位余数、验证码,也保存成数组

    intidCardWiSum=0;//用来保存前17位各自乖以加权因子后的总和

    for(inti=0;i<17;i++){

    idCardWiSum+=[[identityCardsubstringWithRange:NSMakeRange(i,1)]intValue]*[idCardWi[i]intValue];

    }

    intidCardMod=idCardWiSum%11;//计算出校验码所在数组的位置

    NSString*idCardLast=[identityCardsubstringWithRange:NSMakeRange(17,1)];//得到最后一位身份证号码

    //如果等于2,则说明校验码是10,身份证号码最后一位应该是X

    if(idCardMod==2){

    if([idCardLastisEqualToString:@"X"]||[idCardLastisEqualToString:@"x"]){

    returnYES;

    }else{

    returnNO;

    }

    }else{

    //用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码

    if([idCardLastintValue]==[idCardY[idCardMod]intValue]){

    returnYES;

    }else{

    returnNO;

    }

    }

    }

    returnNO;

    }

    相关文章

      网友评论

          本文标题:IOS 最严格的身份证号验证

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