您的位置:首页 > 移动开发 > IOS开发

ios严格检验身份证号码有效性

2015-08-05 21:38 621 查看
+ (BOOL)checkIDCard:(NSString *)sPaperId {
//判断位数
if (sPaperId.length != 15 && sPaperId.length != 18) {
return NO;
}
NSString *carid = sPaperId;
long lSumQT = 0 ;
//加权因子
int R[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
//校验码
unsigned char sChecker[11] = {'1','0','X','9','8','7','6','5','4','3','2'};
//将15位身份证号转换为18位
NSMutableString *mString = [NSMutableString stringWithString:sPaperId];
if (sPaperId.length == 15) {
[mString insertString:@19 atIndex:6];
long p =0;
//        const char *pid = [mString UTF8String];
for (int i =0; i<17; i++)
{
NSString * s = [mString substringWithRange:NSMakeRange(i, 1)];
p += [s intValue] * R[i];
//            p += (long)(pid-48) * R;//

}
int o = p%11;
NSString *string_content = [NSString stringWithFormat:@%c,sChecker[o]];
[mString insertString:string_content atIndex:[mString length]];
carid = mString;
}
//判断地区码
NSString *sProvince = [carid substringToIndex:2];
NSLog(@sProvince = %@,sProvince);
if (![self isAreaCode:sProvince]) {
return NO ;
}
//判断年月日是否有效
//年份
int strYear = [[VUtils getStringWithRange:carid Value1:6 Value2:4] intValue];
//月份
int strMonth = [[VUtils getStringWithRange:carid Value1:10 Value2:2] intValue];
//日
int strDay = [[VUtils getStringWithRange:carid Value1:12 Value2:2] intValue];
NSTimeZone *localZone = [NSTimeZone localTimeZone];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];
[dateFormatter setTimeZone:localZone];
[dateFormatter setDateFormat:@yyyy-MM-dd HH:mm:ss];
NSDate *date = [dateFormatter dateFromString:[NSString stringWithFormat:@%d-%d-%d 12:01:01,strYear,strMonth,strDay]];
if (date == nil) {
return NO;
}
[carid uppercaseString];
const char *PaperId = [carid UTF8String];
//检验长度
if (18!=strlen(PaperId)) {
return NO;
}
//校验数字
NSString * lst = [carid substringFromIndex:carid.length-1];
char di = [carid characterAtIndex:carid.length-1];

if (!isdigit(di)) {
if ([lst isEqualToString:@X]) {
}else{
return NO;
}
}
//验证最末的校验码
lSumQT = 0;
for (int i = 0; i<17; i++){
NSString * s = [carid substringWithRange:NSMakeRange(i, 1)];
lSumQT += [s intValue] * R[i];
}
if (sChecker[lSumQT%11] != PaperId[17]) {
return NO;
}
return YES;
}

+ (NSArray *)provinceArr {
NSArray *pArr = @[

@11,//北京市|110000,

@12,//天津市|120000,

@13,//河北省|130000,

@14,//山西省|140000,

@15,//内蒙古自治区|150000,

@21,//辽宁省|210000,

@22,//吉林省|220000,

@23,//黑龙江省|230000,

@31,//上海市|310000,

@32,//江苏省|320000,

@33,//浙江省|330000,

@34,//安徽省|340000,

@35,//福建省|350000,

@36,//江西省|360000,

@37,//山东省|370000,

@41,//河南省|410000,

@42,//湖北省|420000,

@43,//湖南省|430000,

@44,//广东省|440000,

@45,//广西壮族自治区|450000,

@46,//海南省|460000,

@50,//重庆市|500000,

@51,//四川省|510000,

@52,//贵州省|520000,

@53,//云南省|530000,

@54,//西藏自治区|540000,

@61,//陕西省|610000,

@62,//甘肃省|620000,

@63,//青海省|630000,

@64,//宁夏回族自治区|640000,

@65,//新疆维吾尔自治区|650000,

@71,//台湾省(886)|710000,

@81,//香港特别行政区(852)|810000,

@82,//澳门特别行政区(853)|820000

@91,//国外
];
return pArr;
}

+ (BOOL)isAreaCode:(NSString *)province {
//在provinceArr中找
NSArray * arr = [VUtils provinceArr];
int a = 0;
for (NSString * pr in arr) {
if ([pr isEqualToString:province]) {
a ++;
}
}
if (a == 0) {
return NO;
} else {
return YES;
}
}

+ (NSString *)getStringWithRange:(NSString *)str Value1:(int)v1 Value2:(int)v2 {
NSString * sub = [str substringWithRange:NSMakeRange(v1, v2)];
return sub;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: