//身份证号
+ (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;
}