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; }
上面的代码验证十分全面。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。