• 在项目中进行身份证号码的校验,首先有必要了解一下居民身份证的基本构成:
    • 长度必须是18位,前17位必须是数字,第十八位可以是数字或X;
    • 前两位必须是以下情形中的一种: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;
    • 第7到第14位出生年月日:第7到第10位为出生年份;11到12位表示月份,范围为01-12;13到14位为合法的日期 ;
    • 第17位表示性别,双数表示女,单数表示男;
    • 第18位为前17位的校验位;算法如下:总和 = (n1 + n11) * 7 + (n2 + n12) * 9 + (n3 + n13) * 10 + (n4 + n14) * 5 + (n5 + n15) * 8 + (n6 + n16) * 4 + (n7 + n17) * 2 + n8 + n9 * 6 + n10 * 3,其中n1表示1位数字,其它类似;用总和除以11,看余数是多少, 余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2;
    • 出生年份的前两位必须是19或20;
  • 身份证号验证(粗略验证) :如果只是验证是否是18位纯数字或17位纯数字+x,这个方法完全可以适用。
+ (BOOL)validateIdentityCard:(NSString *)identityCard{NSString *pattern = @"(^[0-9]{15})|([0−9]17([0−9]|X))";NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];BOOL isMatch = [pred evaluateWithObject:identityCard];return isMatch;
}
  • 身份证号全校验
+ (BOOL)verifyIDCardNumber:(NSString *)value {value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];int 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;int year =0;switch (length) {case 15: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:NSRegularExpressionCaseInsensitiveerror: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:NSRegularExpressionCaseInsensitiveerror:nil];//测试出生日期的合法性}numberofMatch = [regularExpression numberOfMatchesInString:valueoptions:NSMatchingReportProgressrange:NSMakeRange(0, value.length)];if(numberofMatch >0) {return YES;}else {return NO;}case 18: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[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:NSRegularExpressionCaseInsensitiveerror: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[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$"options:NSRegularExpressionCaseInsensitiveerror:nil];//测试出生日期的合法性}numberofMatch = [regularExpression numberOfMatchesInString:valueoptions:NSMatchingReportProgressrange: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;}
}

iOS之身份证号码全校验与校验位自动补全相关推荐

  1. dev c++代码自动补全_让代码自动补全的全套流程

    作者: 熊唯,黄飞 ,腾讯 PCG/QQ研发中心/CV应用研究组 AI 如果真的可以写代码了,程序员将何去何从?近几年,NLP 领域的生成式任务有明显的提升,那通过 AI 我们可以让代码自动完成后续补 ...

  2. centos 自动补全c语言,YouCompleteMe自动补全C语言大型项目 ycm

    YouCompleteMe自动补全C语言大型项目 我的ycm在vimrc中的配置" YouCompleteMe相关配置 let g:ycm_server_python_interpreter ...

  3. dev c++代码自动补全_python3代码如何自动补全?

    不知道小伙伴们是不是在勤勤恳恳的一点点写代码,小编最近写代码非常轻松.虽然这样说出来会引起群愤,但不得不说真的很好用.其实就是一个补全代码的工具,在使用之前小编也抱有怀疑的态度,将信将疑.不过最后还是 ...

  4. linux自动补全命令插件,vim自动补全插件snipMate

    linux下安装vim自动补全插件snipMate 环境:ubuntu 下载snipMate 官方网站:http://www.vim.org/scripts/script.php?script_id= ...

  5. linux自动补全死机,ubuntu_linux自动补全出现问题

    问题:输入: cd p,使用Tab补全,期望进入pub_work目录,虽然自动补全,成功进入目录:却给我打印一连串的字符,纠结: [email protected]:~$ cd p+ local cu ...

  6. vs代码自动补全快捷键html,VSCode 自动补全(智能提示)

    自动补全(智能提示) 由于以前微软推出了typescript语言,结合tsd文件,用visual studio写typescript代码是至关爽的,智能提示的功能很是nb.html 这个功能理所应当也 ...

  7. vi php自动补全,vim7.2 代码自动补全的配置 | 学步园

    Tag工具的安装: 安装:解压到home目录下的.vim子目录中. 安装WinManager(调整窗口布局) 安装:解压到home目录下的.vim子目录中. 第三步:使用实例 1.在工程目录下生成ta ...

  8. idea 自动补全返回值,自动补全变量名称和属性名称

    这种时候我们想快速补全返回值和对象,直接点击 ctrl + alt + v 便可

  9. eclipse php 代码补全,Eclipse的代码自动补全插件CodeMix发布CI 2019.8.21|优化性能

    作为Eclipse开发人员,您再也不必觉得自己已被排除在朋友使用Visual Studio Code的乐趣之外. CodeMix是一个Eclipse插件,使您可以直接从Eclipse访问VS Code ...

最新文章

  1. Google Ajax Search 参考
  2. 用 AI 分析蒙娜丽莎的微笑,情绪分析认为她没那么高兴
  3. 揭开Socket编程的面纱
  4. python standard lib_跟Python Standard Library混个脸熟(一)
  5. 13个AJAX验证框架
  6. 专业计算机能力考试 技巧,全国专业技术人员计算机应用能力考试应试技巧
  7. 单片机学c语言还是python好_单片机开发用哪种语言最好?
  8. BZOJ2281 [SDOI2011]黑白棋 【dp + 组合数】
  9. 她玩游戏好都不准我玩游戏了_我们可以玩游戏吗?
  10. ubuntu装指定分区_Ubuntu安装时怎样分区
  11. 论文下载哪家强 | caj 官网软件下载
  12. 马云:中国企业不缺创新缺管理思想
  13. 软考中级-软件设计师 复习指南(2021年11月已通过)
  14. 寺库不再值得认可:违法案例频现,“便宜货”让罗敏和趣店亏惨
  15. 通过深度学习进行高频传感器故障检测和预测性维护
  16. vmware虚拟机实现两台电脑远程桌面连接
  17. json的格式是什么?json的作用是什么?json是如何传递数据的?
  18. 东北大学计算机2020年多少分,2020年东北大学录取分数线公布
  19. 用半角的特殊符号代替全角的特殊符号
  20. Cannot find module ‘webpack‘ Require stack

热门文章

  1. redis api-set
  2. sql注入问题-视图-事物-以及存储过程(可视化工具)
  3. HPU1460: 杨八方的表面兄弟
  4. [完美]原生JS获取浏览器版本判断--支持Edge,IE,Chrome,Firefox,Opera,Safari,以及各种使用Chrome和IE混合内核的浏览器...
  5. ant使用指南详细入门教程
  6. SpringMVC4返回json
  7. iOS开发蓝牙 蓝牙4.0的各种踩过的坑,希望你们少踩点
  8. JS移动客户端--触屏滑动事件 banner图效果
  9. .NET核心正则类详解
  10. ACE线程管理机制-并发控制