美文网首页
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