iOS 身份证校验详解

原创 2016年06月02日 09:57:51
返回YES 就证明通过
+ (BOOL)checkIdCodeWith:(NSString *)string{
    if (string.length == 0) {
        return NO;
    }
    if (string.length == 15 || string.length == 18) {
    } else {
        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"];
    if (![areasArray containsObject:[string substringToIndex:2]]) {
        return NO;
    }
    NSRegularExpression *regularExpression;
    NSUInteger numberofMatch;
    NSInteger year = 0;
    switch (string.length) {
        case 15:
            year = [string substringWithRange:NSMakeRange(6, 2)].integerValue + 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 = [regularExpression numberOfMatchesInString:string options:NSMatchingReportProgress range:NSMakeRange(0, string.length)];
            if (numberofMatch > 0) {
                return YES;
            } else {
                return NO;
            }
            break;
        case 18:
            year = [string substringWithRange:NSMakeRange(6,4)].intValue;
            if (year % 400 == 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:NSRegularExpressionCaseInsensitive error: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-2][0-9]))[0-9]{3}[0-9Xx]$" options:NSRegularExpressionCaseInsensitive error:nil];
            }
            numberofMatch = [regularExpression numberOfMatchesInString:string options:NSMatchingReportProgress range:NSMakeRange(0, string.length)];
            if (numberofMatch > 0) {
                                int S = ([string substringWithRange:NSMakeRange(0,1)].intValue + [string substringWithRange:NSMakeRange(10,1)].intValue) *7 + ([string substringWithRange:NSMakeRange(1,1)].intValue + [string substringWithRange:NSMakeRange(11,1)].intValue) *9 + ([string substringWithRange:NSMakeRange(2,1)].intValue + [string substringWithRange:NSMakeRange(12,1)].intValue) *10 + ([string substringWithRange:NSMakeRange(3,1)].intValue + [string substringWithRange:NSMakeRange(13,1)].intValue) *5 + ([string substringWithRange:NSMakeRange(4,1)].intValue + [string substringWithRange:NSMakeRange(14,1)].intValue) *8 + ([string substringWithRange:NSMakeRange(5,1)].intValue + [string substringWithRange:NSMakeRange(15,1)].intValue) *4 + ([string substringWithRange:NSMakeRange(6,1)].intValue + [string substringWithRange:NSMakeRange(16,1)].intValue) *2 + [string substringWithRange:NSMakeRange(7,1)].intValue *1 + [string substringWithRange:NSMakeRange(8,1)].intValue *6 + [string 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:[string substringWithRange:NSMakeRange(17, 1)]]) {
                    return YES;
                } else {
                    return NO;
                }
            } else {
                return NO;
            }

            break;

            
        default:
            break;
    }
    return YES;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS身份证校验详解

身份证是国民的身份编号,编号是有一定规律的,这里介绍身份证验证规则比较详细。项目中经常会需要对身份证进行校验,我们先了解一些基本知识,然后分析代码 居民身份证号码,根据〖中华人民共和国国家标准...
  • longshihua
  • longshihua
  • 2016年12月11日 11:40
  • 1023

IOS最严格身份证号验证

//身份证号 + (BOOL)CheckIsIdentityCard: (NSString *)identityCard { //判断是否为空 if (identity...
  • zzzili
  • zzzili
  • 2015年10月26日 16:12
  • 2931

iOS之身份证的正则校验

说明: 在ios项目的开发中可能很多地方都需要用到身份证校验,一般在开发的时候很多人都是直接百度去网上荡相关的正则表达式和校验代码,但是网上疯狂 粘贴复制的校验代码本身也可能并不准确,可能会有风险,...
  • LVXIANGAN
  • LVXIANGAN
  • 2015年08月05日 15:02
  • 2008

OC - 正则表达式(身份证号详细验证和粗略验证两种表示,后期会持续添加)

目前公司项目中,有这么一个需求。输入身份证号,当此输入框失去焦点时,判断如果身份证号是错误的,要在身份证号后面,显示一个红色的小叉号。可能会有人觉得很简单嘛,只要写个正则就好了。我开始也是这么想的,因...
  • a645258072
  • a645258072
  • 2016年03月31日 11:15
  • 1650

IOS最严格身份证号验证

//身份证号 + (BOOL)CheckIsIdentityCard: (NSString *)identityCard { //判断是否为空 if (identity...
  • zzzili
  • zzzili
  • 2015年10月26日 16:12
  • 2931

iOS身份证校验详解

身份证是国民的身份编号,编号是有一定规律的,这里介绍身份证验证规则比较详细。项目中经常会需要对身份证进行校验,我们先了解一些基本知识,然后分析代码 居民身份证号码,根据〖中华人民共和国国家标准...
  • longshihua
  • longshihua
  • 2016年12月11日 11:40
  • 1023

iOS之身份证的正则校验

说明: 在ios项目的开发中可能很多地方都需要用到身份证校验,一般在开发的时候很多人都是直接百度去网上荡相关的正则表达式和校验代码,但是网上疯狂 粘贴复制的校验代码本身也可能并不准确,可能会有风险,...
  • LVXIANGAN
  • LVXIANGAN
  • 2015年08月05日 15:02
  • 2008

OC - 正则表达式(身份证号详细验证和粗略验证两种表示,后期会持续添加)

目前公司项目中,有这么一个需求。输入身份证号,当此输入框失去焦点时,判断如果身份证号是错误的,要在身份证号后面,显示一个红色的小叉号。可能会有人觉得很简单嘛,只要写个正则就好了。我开始也是这么想的,因...
  • a645258072
  • a645258072
  • 2016年03月31日 11:15
  • 1650

iOS开发之身份证号码的验证

iOS开发之身份证号码的验证
  • l2i2j2
  • l2i2j2
  • 2016年04月19日 23:54
  • 1601

台湾--身份证(本国人)正则表达式

中華民國身分證字號中的英文字母是以初次登記的戶籍地來區分編號的,而首位數字則是拿來區分性別,男性為1、女性為2,與ISO 5218以及類似的《中華民國國家標準》CNS 8381《資訊交換-人類性別表...
  • sunkaikaisun
  • sunkaikaisun
  • 2015年04月25日 00:08
  • 2311
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS 身份证校验详解
举报原因:
原因补充:

(最多只允许输入30个字)