一聚教程网:一个值得你收藏的教程网站

热门教程

Objective-C实现身份证验证的方法示例

时间:2022-06-25 04:36:13 编辑:袖梨 来源:一聚教程网

最近在一个二次开发的项目中看到了一段身份证验证的OC代码,虽然我一直讨厌二次开发。因为这这个二次开发的项目太老,代码太乱,毫无层次感。可是令人欣慰的是,我在里面发现了一段有用的代码,感兴趣的可以参考学习。

直接上代码

 

 代码如下复制代码

- (BOOL)isValidIdCardNum

{

 NSString *value = [self copy];

 value = [value stringByReplacingOccurrencesOfString:@"X"withString:@"x"];

 value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

 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 = [value substringToIndex:2];

 BOOLareaFlag = NO;

 for(NSString *areaCode in areasArray) {

  if([areaCode isEqualToString:valueStart2]) {

   areaFlag = YES;

   break;

  }

 }

 if(!areaFlag) {

  returnNO;

 }

 NSRegularExpression *regularExpression;

 NSUInteger numberofMatch;

 intyear = 0;

 switch(length) {

  case15:

   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];// 测试出生日期的合法性

   }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];// 测试出生日期的合法性

   }

   numberofMatch =  [regularExpression numberOfMatchesInString:value  options:NSMatchingReportProgress range:NSMakeRange(0, value.length)];

   if(numberofMatch > 0) {

    returnYES;

   }else{

    returnNO;

   }

  case18:

   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];// 测试出生日期的合法性

     

   }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];// 测试出生日期的合法性

   }

   numberofMatch  = [regularExpression numberOfMatchesInString:value  options:NSMatchingReportProgress range:NSMakeRange(0, value.length)];

   if(numberofMatch > 0) {

    intS  = ([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;

    intY = S % 11;

    NSString *M = @"F";

    NSString *JYM = @"10X98765432";

    M = [JYM substringWithRange:NSMakeRange(Y,1)];// 判断校验位

    if([M isEqualToString:[[value substringWithRange:NSMakeRange(17,1)] uppercaseString]]) {

     returnYES;// 检测ID的校验位

    }else{

     returnNO;

    }

   }else{

    returnNO;

   }

    

  default:

   returnNO;

 }

 returnNO;

}

 

上面的代码验证十分全面。

热门栏目