Objective-C實(shí)現(xiàn)身份證驗(yàn)證的方法示例
前言
最近在一個(gè)二次開(kāi)發(fā)的項(xiàng)目中看到了一段身份證驗(yàn)證的OC代碼,雖然我一直討厭二次開(kāi)發(fā)。因?yàn)檫@這個(gè)二次開(kāi)發(fā)的項(xiàng)目太老,代碼太亂,毫無(wú)層次感??墒橇钊诵牢康氖?,我在里面發(fā)現(xiàn)了一段有用的代碼,感興趣的可以參考學(xué)習(xí)。
直接上代碼
- (BOOL)isValidIdCardNum
{
NSString *value = [self copy];
value = [value stringByReplacingOccurrencesOfString:@"X" withString:@"x"];
value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
int length = 0;
if (!value) {
return NO;
}else {
length = (int)value.length;
if (length != 15 && length !=18) {
return NO;
}
}
// 省份代碼
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 = [value substringToIndex:2];
BOOL areaFlag = NO;
for (NSString *areaCode in areasArray) {
if ([areaCode isEqualToString:valueStart2]) {
areaFlag = YES;
break;
}
}
if (!areaFlag) {
return NO;
}
NSRegularExpression *regularExpression;
NSUInteger numberofMatch;
int year = 0;
switch (length) {
case 15:
year = [value substringWithRange:NSMakeRange(6,2)].intValue +1900;
if (year % 4 ==0 || (year % 100 ==0 && year % 4 ==0)) {
regularExpression = [[NSRegularExpression alloc] 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:NSRegularExpressionCaseInsensitive error:nil];// 測(cè)試出生日期的合法性
}else {
regularExpression = [[NSRegularExpression alloc] 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:NSRegularExpressionCaseInsensitive error:nil];// 測(cè)試出生日期的合法性
}
numberofMatch = [regularExpression numberOfMatchesInString:value options:NSMatchingReportProgress range:NSMakeRange(0, value.length)];
if(numberofMatch > 0) {
return YES;
}else {
return NO;
}
case 18:
year = [value substringWithRange:NSMakeRange(6,4)].intValue;
if (year % 4 ==0 || (year % 100 ==0 && year % 4 ==0)) {
regularExpression = [[NSRegularExpression alloc] 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:NSRegularExpressionCaseInsensitive error:nil];// 測(cè)試出生日期的合法性
}else {
regularExpression = [[NSRegularExpression alloc] 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:NSRegularExpressionCaseInsensitive error:nil];// 測(cè)試出生日期的合法性
}
numberofMatch = [regularExpression numberOfMatchesInString:value options:NSMatchingReportProgress range:NSMakeRange(0, value.length)];
if(numberofMatch > 0) {
int S = ([value substringWithRange:NSMakeRange(0,1)].intValue + [value substringWithRange:NSMakeRange(10,1)].intValue) *7 + ([value substringWithRange:NSMakeRange(1,1)].intValue + [value substringWithRange:NSMakeRange(11,1)].intValue) *9 + ([value substringWithRange:NSMakeRange(2,1)].intValue + [value substringWithRange:NSMakeRange(12,1)].intValue) *10 + ([value substringWithRange:NSMakeRange(3,1)].intValue + [value substringWithRange:NSMakeRange(13,1)].intValue) *5 + ([value substringWithRange:NSMakeRange(4,1)].intValue + [value substringWithRange:NSMakeRange(14,1)].intValue) *8 + ([value substringWithRange:NSMakeRange(5,1)].intValue + [value substringWithRange:NSMakeRange(15,1)].intValue) *4 + ([value substringWithRange:NSMakeRange(6,1)].intValue + [value substringWithRange:NSMakeRange(16,1)].intValue) *2 + [value substringWithRange:NSMakeRange(7,1)].intValue *1 + [value substringWithRange:NSMakeRange(8,1)].intValue *6 + [value substringWithRange:NSMakeRange(9,1)].intValue *3;
int Y = S % 11;
NSString *M = @"F";
NSString *JYM = @"10X98765432";
M = [JYM substringWithRange:NSMakeRange(Y,1)]; // 判斷校驗(yàn)位
if ([M isEqualToString:[[value substringWithRange:NSMakeRange(17,1)] uppercaseString]]) {
return YES;// 檢測(cè)ID的校驗(yàn)位
}else {
return NO;
}
}else {
return NO;
}
default:
return NO;
}
return NO;
}
上面的代碼驗(yàn)證十分全面。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
iOS實(shí)現(xiàn)第三方微信登錄方式實(shí)例解析(最新最全)
這篇文章主要介紹了iOS實(shí)現(xiàn)第三方微信登錄方式實(shí)例解析(最新最全),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12
IOS中實(shí)現(xiàn)圖片點(diǎn)擊全屏預(yù)覽
IOS作為一款智能手機(jī)系統(tǒng),在查看圖片的時(shí)候,如果能夠?qū)崿F(xiàn)全屏,對(duì)用戶來(lái)說(shuō)有很好的視覺(jué)體驗(yàn),其實(shí)實(shí)現(xiàn)起來(lái)非常的簡(jiǎn)單,下面我就結(jié)合一個(gè)簡(jiǎn)單的代碼給大家來(lái)分享一下,,需要的朋友可以參考下2015-11-11
iOS的XMPPFramework簡(jiǎn)單介紹(實(shí)現(xiàn)及時(shí)通信)
這篇文章主要介紹了iOS的XMPPFramework簡(jiǎn)單介紹(實(shí)現(xiàn)及時(shí)通信),實(shí)現(xiàn)了基于XMPP協(xié)議通信的開(kāi)發(fā),有需要的朋友可以了解一下。2016-11-11
iOS開(kāi)發(fā)————詳解適配iOS10問(wèn)題
ios10已經(jīng)推出一段時(shí)間了,這篇文章主要介紹了iOS開(kāi)發(fā)————詳解適配iOS10,有興趣的可以了解一下。2016-12-12
如何使用IOS自動(dòng)化測(cè)試工具UIAutomation
這篇文章主要介紹了UIAutomation使用實(shí)例、應(yīng)用技巧、基本知識(shí)點(diǎn)總結(jié)和需要注意事項(xiàng),具有一定的參考價(jià)值2021-04-04
IOS 基礎(chǔ)之設(shè)置 tableview 的分割線
這篇文章主要介紹了IOS 基礎(chǔ)之設(shè)置 tableview 的分割線的相關(guān)資料,需要的朋友可以參考下2017-03-03
iOS開(kāi)發(fā)之UIScrollView控件詳解
UIScrollView是一個(gè)非常重要的控件,其可以展示比設(shè)備屏幕更大區(qū)域的內(nèi)容,我們可以通過(guò)手指滑動(dòng)來(lái)查看內(nèi)容視圖的每一部分內(nèi)容,也可以通過(guò)手指捏合來(lái)對(duì)內(nèi)容視圖進(jìn)行縮放操作,我們每天開(kāi)發(fā)中都不斷顯式或隱式地與UIScrollView打交道,下面給大家詳細(xì)介紹UIScrollView控件。2016-09-09

