判断身份证号正确

来源:互联网 发布:实景地图软件 编辑:程序博客网 时间:2024/05/19 19:15

创建一个公共类,

CommonTool.h

/** *  @author lixianhong, 16-07-15 15:07:37 * *  判断身份证是否正确 * *  @param value 身份证号 * *  @return YES or NO */+ (BOOL)judgeIdcardLegal:(NSString *)value;

CommonTool.m

+ (BOOL)judgeIdcardLegal:(NSString *)value {        value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];        NSInteger 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;        NSInteger year =0;        switch (length) {                    case 15:                        year = [value substringWithRange:NSMakeRange(8,2)].intValue +1900;                        if (year %400 ==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:匹配到得字符串的个数            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 %400 ==0 || (year %100 !=0 && year %4 ==0)) {                                //原来的@"^[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]$"                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) {                                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;    }    }


0 0
原创粉丝点击