说明:
  在ios项目的开发中可能很多地方都需要用到身份证校验,一般在开发的时候很多人都是直接百度去网上荡相关的正则表达式和校验代码,但是网上疯狂粘贴复制的校验代码本身也可能并不准确,可能会有风险,比如2013年1月1号起停止使用15位的身份证,网上的身份证校验普遍支持15位的号码。
  在开发过程中,进行类似处理的时候,还是需要一些甄别的能力的,当然也要考虑自己的项目的实际情况。该文贴出了近项目中使用到得身份证校验代码,以方便有需要的人“谨慎”获取。
  一、规则
  下面是iOS身份证校验规则,对于第6点值得商榷,按道理出生年份前两位是20也应该是合理的。如果要校验投保人需要年满18岁,需要另行检查,不应放在身份证校验里面。
  长度必须是18位,前17位必须是数字,第十八位可以是数字或X(校验时不区分大小写)
  前两位必须是以下35种情形中的一种: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位为合法的日期,比如月份是04,范围应是01~30
  第17位表示性别,必须是0或1,0表示女,1表示男
  第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,看余数是多少,余数只可能有012345678910这11个数字。其分别对应的后一位身份证的号码为10X98765432
  第7位必须为1,第8位必须为9,即:出生年份的前两位必须是19
  二、代码示例:
  对于这种需要在很多地方都用到的代码,可以使用一个工具类或者是分类来写。这里把校验的代码写在了一个工具类中。
  VerifyRegexTool.h文件代码:

 

1#import<Foundation/Foundation.h>
2
3@interfaceVerifyRegexTool:NSObject
4
5+(BOOL)verifyIsNotEmpty:(NSString*)str;//验证是否不为空
6
7+(BOOL)verifyText:(NSString*)textwithRegex:(NSString*)regex;//正则验证
8
9+(BOOL)verifyIDCardNumber:(NSString*)value;//验证身份证
10
11+(BOOL)verifyCardNumberWithSoldier:(NSString*)value;//验证军官证或警官证
12
13+(BOOL)verifyIDCardHadAdult:(NSString*)card;//验证身份证是否成年且小于100岁****这个方法中不做身份证校验,请确保传入的是正确身份证
14
15+(BOOL)verifyIDCardMoreThanPointDate:(NSString*)cardwithNumber:(NSInteger)numberwithAddTimeInterval:(NSTimeInterval)intervalwithDateType:(DateType)dateType;//验证身份证加上指定天数是否大于指定number的类型
16
17+(BOOL)verifyIDCardLessThanPointDate:(NSString*)cardwithNumber:(NSInteger)numberwithAddTimeInterval:(NSTimeInterval)intervalwithDateType:(DateType)dateType;//验证身份证是否小于指定number的类型
18
19
20+(NSString*)getIDCardBirthday:(NSString*)card;//得到身份证的生日****这个方法中不做身份证校验,请确保传入的是正确身份证
21+(NSInteger)getIDCardSex:(NSString*)card;//得到身份证的性别(1男0女)****这个方法中不做身份证校验,请确保传入的是正确身份证
22
23@end