//身份證號
+?(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位加權(quán)因子保存在數(shù)組里
NSArray*?idCardY=@[@"1",@"0",@"10",@"9",@"8",@"7",@"6",@"5",@"4",@"3",@"2"];//這是除以11后,可能產(chǎn)生的11位余數(shù)惑灵、驗證碼惫确,也保存成數(shù)組
intidCardWiSum=0;//用來保存前17位各自乖以加權(quán)因子后的總和
for(inti=0;i<17;i++){
idCardWiSum+=[[identityCardsubstringWithRange:NSMakeRange(i,1)]intValue]*[idCardWi[i]intValue];
}
intidCardMod=idCardWiSum%11;//計算出校驗碼所在數(shù)組的位置
NSString*idCardLast=[identityCardsubstringWithRange:NSMakeRange(17,1)];//得到最后一位身份證號碼
//如果等于2手报,則說明校驗碼是10蚯舱,身份證號碼最后一位應(yīng)該是X
if(idCardMod==2){
if([idCardLastisEqualToString:@"X"]||[idCardLastisEqualToString:@"x"]){
returnYES;
}else{
returnNO;
}
}else{
//用計算出的驗證碼與最后一位身份證號碼匹配,如果一致掩蛤,說明通過枉昏,否則是無效的身份證號碼
if([idCardLastintValue]==[idCardY[idCardMod]intValue]){
returnYES;
}else{
returnNO;
}
}
}
returnNO;
}