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;
}

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

相关文章推荐

Swift版身份证号码校验

Swift版身份证号码校验最近写用swift开发项目,在网上找了很多关于身份证号码校验的文章都没有能达到精准校验的效果,为此,我写了一个swift版本:extension NSString { ...

swift 实现身份证最后一位校验,符合(ISO 7064:1983.MOD 11-2)标准,包括正则校验

/*没废话,直接上代码*/ //iso加权数组     static let iso7064Arr = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5...

swift 验证输入身份证号的合法性

这是我看到用 oc 写的身份证号的合法性校验后自己用 swift 写了一下,具体哪里看来的忘了,没标出处,望原作者见谅! 直接上代码! func validateIDCardNumber(sfz...

iOS身份证校验详解

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

swift语言使用正则表达式验证字符串是否为邮箱,手机号,身份证号

最近用到邮箱验证功能,在网上找了下没有找到合适的swift语言写的邮箱验证,于是就写了个swift语言版的邮箱验证,简单易用。...

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

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

iOS 校验身份证是否合法

//校验身份证是否合法 -(bool)checkIDCardIsOrNotLegalWithIDCard:(NSString *)identityCard { BOOL flag; i...

iOS Objective-C 身份证号码校验

做iOS开发已经两年多了。最近,在整理以前的代码,找到当时卡壳的一些代码片段,写博客跟大家分享一下。欢迎iOS初学者订阅我的博客,有什么问题可以留言交流。以下正文: 不知道领导哪根筋搭错了,非要验...
  • afyzgh
  • afyzgh
  • 2013年11月26日 15:18
  • 2754

IOS 身份证校验

IOS 身份证校验身份证基础知识:身份证是国民的身份编号,编号是有一定规律的,这里介绍身份证验证规则比较详细。项目中经常会需要对身份证进行校验,我们先了解一些基本知识,然后分析代码居民身份证号码,根据...

iOS身份证号码全校验与校验位自动补全

在项目中进行身份证号码的校验,首先有必要了解一下居民身份证的基本构成: 1、长度必须是18位,前17位必须是数字,第十八位可以是数字或X; 2、前两位必须是以下情形中的一种:11、12、13、14...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS 身份证校验详解
举报原因:
原因补充:

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