生活随笔
收集整理的這篇文章主要介紹了
iOS之身份证号码全校验与校验位自动补全
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 在項目中進行身份證號碼的校驗,首先有必要了解一下居民身份證的基本構成:
-
- 長度必須是18位,前17位必須是數字,第十八位可以是數字或X;
-
- 前兩位必須是以下情形中的一種: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;
-
- 第7到第14位出生年月日:第7到第10位為出生年份;11到12位表示月份,范圍為01-12;13到14位為合法的日期 ;
-
-
- 第18位為前17位的校驗位;算法如下:總和 = (n1 + n11) * 7 + (n2 + n12) * 9 + (n3 + n13) * 10 + (n4 + n14) * 5 + (n5 + n15) * 8 + (n6 + n16) * 4 + (n7 + n17) * 2 + n8 + n9 * 6 + n10 * 3,其中n1表示1位數字,其它類似;用總和除以11,看余數是多少, 余數只可能有0 1 2 3 4 5 6 7 8 9 10這11個數字。其分別對應的最后一位身份證的號碼為1 0 X 9 8 7 6 5 4 3 2;
-
- 身份證號驗證(粗略驗證) :如果只是驗證是否是18位純數字或17位純數字+x,這個方法完全可以適用。
+ (BOOL)validateIdentityCard:(NSString *)identityCard{NSString *pattern = @"(^[0-9]{15})|([0?9]17([0?9]|X))";NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];BOOL isMatch = [pred evaluateWithObject:identityCard];return isMatch;
}
+ (BOOL)verifyIDCardNumber:(NSString *)value {value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];int length =0;if (!value) {return NO;} else {length = 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 false;}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:NSRegularExpressionCaseInsensitiveerror:nil];//測試出生日期的合法性}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:NSRegularExpressionCaseInsensitiveerror:nil];//測試出生日期的合法性}numberofMatch = [regularExpression numberOfMatchesInString:valueoptions:NSMatchingReportProgressrange: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[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 = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}19[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 = [regularExpression numberOfMatchesInString:valueoptions:NSMatchingReportProgressrange: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)];// 判斷校驗位if ([M isEqualToString:[value substringWithRange:NSMakeRange(17,1)]]) {return YES;// 檢測ID的校驗位}else {return NO;}}else {return NO;}default:return false;}
}
總結
以上是生活随笔為你收集整理的iOS之身份证号码全校验与校验位自动补全的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。