身份证验证其正确性

这个有点点多,不过确实很实用


//身份证验证

+ (BOOL) validateIdentityCard: (NSString *)identityCard

{

    //判断位数

    

    

   if ([identityCard length] != 15 && [identityCard length] != 18) {

       return NO;

    }

   NSString *carid = identityCard;

    

   long lSumQT =0;

    

    //加权因子

    

   int R[] ={7,9, 10, 5, 8, 4,2, 1, 6, 3, 7,9, 10, 5, 8, 4,2 };

    

    //校验码

    

   unsigned char sChecker[11]={'1','0','X','9', '8', '7', '6', '5','4', '3', '2'};

    

    

    

    //15位身份证号转换成18

    

   NSMutableString *mString = [NSMutableStringstringWithString:identityCard];

    

   if ([identityCard length] == 15) {

        

        [mStringinsertString:@"19"atIndex:6];

        

       long p = 0;

        

       const char *pid = [mStringUTF8String];

        

       for (int i=0; i<=16; i++)

            

        {

            

            p += (pid[i]-48) * R[i];

            

        }

        

       int o = p%11;

        

       NSString *string_content = [NSStringstringWithFormat:@"%c",sChecker[o]];

        

        [mStringinsertString:string_content atIndex:[mString length]];

        

        carid = mString;

        

    }

    

    //判断地区码

    

   NSString * sProvince = [carid substringToIndex:2];

    

   if (![UnityareaCode:sProvince]) {

        

       return NO;

        

    }

    

    //判断年月日是否有效

    

    

    

   //年份

    

   int strYear = [[UnitygetStringWithRange:carid Value1:6 Value2:4]intValue];

    

   //月份

    

   int strMonth = [[UnitygetStringWithRange:carid Value1:10 Value2:2]intValue];

    

   //

    

   int strDay = [[UnitygetStringWithRange:carid Value1:12 Value2:2]intValue];

    

    

    

   NSTimeZone *localZone = [NSTimeZonelocalTimeZone];

    

   NSDateFormatter *dateFormatter = [[[NSDateFormatteralloc] initautorelease];

    

    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];

    

    [dateFormatter setTimeStyle:NSDateFormatterNoStyle];

    

    [dateFormattersetTimeZone:localZone];

    

    [dateFormattersetDateFormat:@"yyyy-MM-dd HH:mm:ss"];

    

   NSDate *date=[dateFormatter dateFromString:[NSString stringWithFormat:@"%d-%d-%d 12:01:01",strYear,strMonth,strDay]];

    

   if (date == nil) {

        

       return NO;

        

    }

    

   const char *PaperId  = [caridUTF8String];

    

    //检验长度

    

   if( 18 != strlen(PaperId)) return -1;

    

    

    

    //校验数字

    

   for (int i=0; i<18; i++)

        

    {

        

       if ( !isdigit(PaperId[i]) && !(('X' == PaperId[i] ||'x' == PaperId[i]) && 17 == i) )

            

        {

            

           return NO;

            

        }

        

    }

    

    //验证最末的校验码

    

   for (int i=0; i<=16; i++)

        

    {

        

        lSumQT += (PaperId[i]-48) * R[i];

        

    }

    

   if (sChecker[lSumQT%11] != PaperId[17] )

        

    {

        

       return NO;

        

    }

    

    return YES;

}


+ (NSString *)getStringWithRange:(NSString *)str Value1:(NSInteger)value1 Value2:(NSInteger )value2;


{

    return [strsubstringWithRange:NSMakeRange(value1,value2)];

}




/**

 

 * 功能:判断是否在地区码内

 

 * 参数:地区码

 

 */


+ (BOOL)areaCode:(NSString *)code


{

    

    NSMutableDictionary *dic = [[[NSMutableDictionaryalloc] init] autorelease];

    

    [dic setObject:@"北京"forKey:@"11"];

    

    [dic setObject:@"天津"forKey:@"12"];

    

    [dic setObject:@"河北"forKey:@"13"];

    

    [dic setObject:@"山西"forKey:@"14"];

    

    [dic setObject:@"内蒙古"forKey:@"15"];

    

    [dic setObject:@"辽宁"forKey:@"21"];

    

    [dic setObject:@"吉林"forKey:@"22"];

    

    [dic setObject:@"黑龙江"forKey:@"23"];

    

    [dic setObject:@"上海"forKey:@"31"];

    

    [dic setObject:@"江苏"forKey:@"32"];

    

    [dic setObject:@"浙江"forKey:@"33"];

    

    [dic setObject:@"安徽"forKey:@"34"];

    

    [dic setObject:@"福建"forKey:@"35"];

    

    [dic setObject:@"江西"forKey:@"36"];

    

    [dic setObject:@"山东"forKey:@"37"];

    

    [dic setObject:@"河南"forKey:@"41"];

    

    [dic setObject:@"湖北"forKey:@"42"];

    

    [dic setObject:@"湖南"forKey:@"43"];

    

    [dic setObject:@"广东"forKey:@"44"];

    

    [dic setObject:@"广西"forKey:@"45"];

    

    [dic setObject:@"海南"forKey:@"46"];

    

    [dic setObject:@"重庆"forKey:@"50"];

    

    [dic setObject:@"四川"forKey:@"51"];

    

    [dic setObject:@"贵州"forKey:@"52"];

    

    [dic setObject:@"云南"forKey:@"53"];

    

    [dic setObject:@"西藏"forKey:@"54"];

    

    [dic setObject:@"陕西"forKey:@"61"];

    

    [dic setObject:@"甘肃"forKey:@"62"];

    

    [dic setObject:@"青海"forKey:@"63"];

    

    [dic setObject:@"宁夏"forKey:@"64"];

    

    [dic setObject:@"新疆"forKey:@"65"];

    

    [dic setObject:@"台湾"forKey:@"71"];

    

    [dic setObject:@"香港"forKey:@"81"];

    

    [dic setObject:@"澳门"forKey:@"82"];

    

    [dic setObject:@"国外"forKey:@"91"];

    

   if ([dic objectForKey:code] ==nil) {

        

       return NO;

        

    }

    

    return YES;

    

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值