Objective-C 判斷身份證號碼格式
-?(BOOL)judgeIdentityStringValid:(NSString?*)identityString?{??
if?(identityString.length?!=?18)?return?NO; ?
//?正則表達式判斷基本?身份證號是否滿足格式??
NSString?*regex2?=?@"^(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)$";??
NSPredicate?*identityStringPredicate?=?[NSPredicate?predicateWithFormat:@"SELF?MATCHES?%@",regex2];??
//如果通過該驗證,說明身份證格式正確,但準確性還需計算??
if(![identityStringPredicate?evaluateWithObject:identityString])?return?NO;??
//**?開始進行校驗?*//??
//將前17位加權因子保存在數組里??
NSArray?*idCardWiArray?=?@[@"7",?@"9",?@"10",?@"5",?@"8",?@"4",?@"2",?@"1",?@"6",?@"3",?@"7",?@"9",?@"10",?@"5",?@"8",?@"4",?@"2"];??
//這是除以11后,可能產生的11位余數、驗證碼,也保存成數組??
NSArray?*idCardYArray?=?@[@"1",?@"0",?@"10",?@"9",?@"8",?@"7",?@"6",?@"5",?@"4",?@"3",?@"2"];??
//用來保存前17位各自乖以加權因子后的總和??
NSInteger?idCardWiSum?=0;??
for(int?i?=?0;i?<?17;i++)?{??
NSInteger?subStrIndex?=?[[identityString?substringWithRange:NSMakeRange(i,?1)]?integerValue];??
NSInteger?idCardWiIndex?=?[[idCardWiArray?objectAtIndex:i]?integerValue];??
idCardWiSum+=subStrIndex?*?idCardWiIndex;??
????} ?
//計算出校驗碼所在數組的位置??
NSInteger?idCardMod=idCardWiSum%11;??
//得到最后一位身份證號碼??
NSString?*idCardLast=?[identityString?substringWithRange:NSMakeRange(17,?1)];??
//如果等于2,則說明校驗碼是10,身份證號碼最后一位應該是X??
if(idCardMod==2)?{??
if(![idCardLast?isEqualToString:@"X"]||[idCardLast?isEqualToString:@"x"])?{??
return?NO;??
????????}??
????}??
else{??
//用計算出的驗證碼與最后一位身份證號碼匹配,如果一致,說明通過,否則是無效的身份證號碼??
if(![idCardLast?isEqualToString:?[idCardYArray?objectAtIndex:idCardMod]])?{??
return?NO;??
????????}??
????}??
return?YES;??
}??