Objective-C实现身份证验证的方法示例
前言
最近在一个二次开发的项目中看到了一段身份证验证的OC代码,虽然我一直讨厌二次开发。因为这这个二次开发的项目太老,代码太乱,毫无层次感。可是令人欣慰的是,我在里面发现了一段有用的代码,感兴趣的可以参考学习。
直接上代码
-(BOOL)isValidIdCardNum
{
NSString*value=[selfcopy];
value=[valuestringByReplacingOccurrencesOfString:@"X"withString:@"x"];
value=[valuestringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceAndNewlineCharacterSet]];
intlength=0;
if(!value){
returnNO;
}else{
length=(int)value.length;
if(length!=15&&length!=18){
returnNO;
}
}
//省份代码
NSArray*areasArray=@[@"11",@"12",@"13",@"14",@"15",@"21",@"22",@"23",@"31",@"32",@"33",@"34",@"35",@"36",@"37",@"41",@"42",@"43",@"44",@"45",@"46",@"50",@"51",@"52",@"53",@"54",@"61",@"62",@"63",@"64",@"65",@"71",@"81",@"82",@"91"];
NSString*valueStart2=[valuesubstringToIndex:2];
BOOLareaFlag=NO;
for(NSString*areaCodeinareasArray){
if([areaCodeisEqualToString:valueStart2]){
areaFlag=YES;
break;
}
}
if(!areaFlag){
returnNO;
}
NSRegularExpression*regularExpression;
NSUIntegernumberofMatch;
intyear=0;
switch(length){
case15:
year=[valuesubstringWithRange:NSMakeRange(6,2)].intValue+1900;
if(year%4==0||(year%100==0&&year%4==0)){
regularExpression=[[NSRegularExpressionalloc]initWithPattern:@"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$"options:NSRegularExpressionCaseInsensitiveerror:nil];//测试出生日期的合法性
}else{
regularExpression=[[NSRegularExpressionalloc]initWithPattern:@"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$"options:NSRegularExpressionCaseInsensitiveerror:nil];//测试出生日期的合法性
}
numberofMatch=[regularExpressionnumberOfMatchesInString:valueoptions:NSMatchingReportProgressrange:NSMakeRange(0,value.length)];
if(numberofMatch>0){
returnYES;
}else{
returnNO;
}
case18:
year=[valuesubstringWithRange:NSMakeRange(6,4)].intValue;
if(year%4==0||(year%100==0&&year%4==0)){
regularExpression=[[NSRegularExpressionalloc]initWithPattern:@"^[1-9][0-9]{5}19|20[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$"options:NSRegularExpressionCaseInsensitiveerror:nil];//测试出生日期的合法性
}else{
regularExpression=[[NSRegularExpressionalloc]initWithPattern:@"^[1-9][0-9]{5}19|20[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$"
options:NSRegularExpressionCaseInsensitiveerror:nil];//测试出生日期的合法性
}
numberofMatch=[regularExpressionnumberOfMatchesInString:valueoptions:NSMatchingReportProgressrange:NSMakeRange(0,value.length)];
if(numberofMatch>0){
intS=([valuesubstringWithRange:NSMakeRange(0,1)].intValue+[valuesubstringWithRange:NSMakeRange(10,1)].intValue)*7+([valuesubstringWithRange:NSMakeRange(1,1)].intValue+[valuesubstringWithRange:NSMakeRange(11,1)].intValue)*9+([valuesubstringWithRange:NSMakeRange(2,1)].intValue+[valuesubstringWithRange:NSMakeRange(12,1)].intValue)*10+([valuesubstringWithRange:NSMakeRange(3,1)].intValue+[valuesubstringWithRange:NSMakeRange(13,1)].intValue)*5+([valuesubstringWithRange:NSMakeRange(4,1)].intValue+[valuesubstringWithRange:NSMakeRange(14,1)].intValue)*8+([valuesubstringWithRange:NSMakeRange(5,1)].intValue+[valuesubstringWithRange:NSMakeRange(15,1)].intValue)*4+([valuesubstringWithRange:NSMakeRange(6,1)].intValue+[valuesubstringWithRange:NSMakeRange(16,1)].intValue)*2+[valuesubstringWithRange:NSMakeRange(7,1)].intValue*1+[valuesubstringWithRange:NSMakeRange(8,1)].intValue*6+[valuesubstringWithRange:NSMakeRange(9,1)].intValue*3;
intY=S%11;
NSString*M=@"F";
NSString*JYM=@"10X98765432";
M=[JYMsubstringWithRange:NSMakeRange(Y,1)];//判断校验位
if([MisEqualToString:[[valuesubstringWithRange:NSMakeRange(17,1)]uppercaseString]]){
returnYES;//检测ID的校验位
}else{
returnNO;
}
}else{
returnNO;
}
default:
returnNO;
}
returnNO;
}
上面的代码验证十分全面。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。