IOS最严格身份证号验证

举报
清雨小竹 发表于 2022/09/25 00:14:45 2022/09/25
【摘要】 //身份证号 + (BOOL)CheckIsIdentityCard: (NSString *)identityCard { //判断是否为空 if (identityCard==nil||identityCard.length <= 0) { return NO; ...
//身份证号  
+ (BOOL)CheckIsIdentityCard: (NSString *)identityCard  
{  
    //判断是否为空  
    if (identityCard==nil||identityCard.length <= 0) {  
        return NO;  
    }  
    //判断是否是18位,末尾是否是x  
    NSString *regex2 = @"^(\\d{14}|\\d{17})(\\d|[xX])$";  
    NSPredicate *identityCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex2];  
    if(![identityCardPredicate evaluateWithObject:identityCard]){  
        return NO;  
    }  
    //判断生日是否合法  
    NSRange range = NSMakeRange(6,8);  
    NSString *datestr = [identityCard substringWithRange:range];  
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];  
    [formatter setDateFormat : @"yyyyMMdd"];  
    if([formatter dateFromString:datestr]==nil){  
        return NO;  
    }  
      
    //判断校验位  
    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位余数、验证码,也保存成数组  
        int idCardWiSum=0; //用来保存前17位各自乖以加权因子后的总和  
        for(int i=0;i<17;i++){  
            idCardWiSum+=[[identityCard substringWithRange:NSMakeRange(i,1)] intValue]*[idCardWi[i] intValue];  
        }  
          
        int idCardMod=idCardWiSum%11;//计算出校验码所在数组的位置  
        NSString *idCardLast=[identityCard substringWithRange:NSMakeRange(17,1)];//得到最后一位身份证号码  
          
        //如果等于2,则说明校验码是10,身份证号码最后一位应该是X  
        if(idCardMod==2){  
            if([idCardLast isEqualToString:@"X"]||[idCardLast isEqualToString:@"x"]){  
                return YES;  
            }else{  
                return NO;  
            }  
        }else{  
            //用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码  
            if([idCardLast intValue]==[idCardY[idCardMod] intValue]){  
                return YES;  
            }else{  
                return NO;  
            }  
        }  
    }  
    return NO;  
}  

文章来源: zzzili.blog.csdn.net,作者:清雨小竹,版权归原作者所有,如需转载,请联系作者。

原文链接:zzzili.blog.csdn.net/article/details/49425501

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。