+ (BOOL)checkIDCard:(NSString *)sPaperId {
//判断位数
if (sPaperId.length != && sPaperId.length != ) {
return NO;
}
NSString *carid = sPaperId;
long lSumQT = ;
//加权因子
int R[] = {,,,,,,,,,,,,,,,,};
//校验码
unsigned char sChecker[] = {'','','X','','','','','','','',''};
//将15位身份证号转换为18位
NSMutableString *mString = [NSMutableString stringWithString:sPaperId];
if (sPaperId.length == ) {
[mString insertString:@ atIndex:];
long p =;
// const char *pid = [mString UTF8String];
for (int i =; i<; i++)
{
NSString * s = [mString substringWithRange:NSMakeRange(i, )];
p += [s intValue] * R[i];
// p += (long)(pid-48) * R;// }
int o = p%;
NSString *string_content = [NSString stringWithFormat:@%c,sChecker[o]];
[mString insertString:string_content atIndex:[mString length]];
carid = mString;
}
//判断地区码
NSString *sProvince = [carid substringToIndex:];
NSLog(@sProvince = %@,sProvince);
if (![self isAreaCode:sProvince]) {
return NO ;
}
//判断年月日是否有效
//年份
int strYear = [[VUtils getStringWithRange:carid Value1: Value2:] intValue];
//月份
int strMonth = [[VUtils getStringWithRange:carid Value1: Value2:] intValue];
//日
int strDay = [[VUtils getStringWithRange:carid Value1: Value2:] 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 ::,strYear,strMonth,strDay]];
if (date == nil) {
return NO;
}
[carid uppercaseString];
const char *PaperId = [carid UTF8String];
//检验长度
if (!=strlen(PaperId)) {
return NO;
}
//校验数字
NSString * lst = [carid substringFromIndex:carid.length-];
char di = [carid characterAtIndex:carid.length-]; if (!isdigit(di)) {
if ([lst isEqualToString:@X]) {
}else{
return NO;
}
}
//验证最末的校验码
lSumQT = ;
for (int i = ; i<; i++){
NSString * s = [carid substringWithRange:NSMakeRange(i, )];
lSumQT += [s intValue] * R[i];
}
if (sChecker[lSumQT%] != PaperId[]) {
return NO;
}
return YES;
} + (NSArray *)provinceArr {
NSArray *pArr = @[ @,//北京市|110000, @,//天津市|120000, @,//河北省|130000, @,//山西省|140000, @,//内蒙古自治区|150000, @,//辽宁省|210000, @,//吉林省|220000, @,//黑龙江省|230000, @,//上海市|310000, @,//江苏省|320000, @,//浙江省|330000, @,//安徽省|340000, @,//福建省|350000, @,//江西省|360000, @,//山东省|370000, @,//河南省|410000, @,//湖北省|420000, @,//湖南省|430000, @,//广东省|440000, @,//广西壮族自治区|450000, @,//海南省|460000, @,//重庆市|500000, @,//四川省|510000, @,//贵州省|520000, @,//云南省|530000, @,//西藏自治区|540000, @,//陕西省|610000, @,//甘肃省|620000, @,//青海省|630000, @,//宁夏回族自治区|640000, @,//新疆维吾尔自治区|650000, @,//台湾省(886)|710000, @,//香港特别行政区(852)|810000, @,//澳门特别行政区(853)|820000 @,//国外
];
return pArr;
} + (BOOL)isAreaCode:(NSString *)province {
//在provinceArr中找
NSArray * arr = [VUtils provinceArr];
int a = ;
for (NSString * pr in arr) {
if ([pr isEqualToString:province]) {
a ++;
}
}
if (a == ) {
return NO;
} else {
return YES;
}
} + (NSString *)getStringWithRange:(NSString *)str Value1:(int)v1 Value2:(int)v2 {
NSString * sub = [str substringWithRange:NSMakeRange(v1, v2)];
return sub;
}

ios严格检验身份证号码有效性的更多相关文章

  1. Python实现身份证号码有效性验证

    # -*- coding: utf-8 -*- import re #Errors=['验证通过!','身份证号码位数不对!','身份证号码出生日期超出范围或含有非法字符!','身份证号码校验错误!' ...

  2. JavaScript身份证号码有效性验证

    最近需要对身份证合法性进行验证,实名验证是不指望了,不过原来的验证规则太过简单,只是简单的验证了身份证长度,现在业务需要加强下身份证验证规则,网上找到了不少资料,不过都不合偶的心意,无奈只好直接写一个 ...

  3. php验证身份证号码有效性

    <?php // 18位身份证校验码有效性检查 // idcard_checksum18('...'); function idcard_checksum18($idcard) { if (st ...

  4. IOS 根据身份证号码获取 年龄 生日 性别

    /** 从身份证上获取年龄 18位身份证 */ -(NSString *)getIdentityCardAge:(NSString *)numberStr { NSDateFormatter *for ...

  5. iOS身份证号码识别

    一.前言   身份证识别,又称OCR技术.OCR技术是光学字符识别的缩写,是通过扫描等光学输入方式将各种票据.报刊.书籍.文稿及其它印刷品的文字转化为图像信息,再利用文字识别技术将图像信息转化为可以使 ...

  6. php验证身份证号码正确性

    发布:JB01   来源:脚本学堂     [大 中 小] 分享一例php代码,用于验证身份证号码的正确性,用到了preg_match.preg_replace函数,有需要的朋友可以参考学习下.本文转 ...

  7. 输入身份证号码自动读取生日与性别(delphi)

    一.格式介绍: [15位号码格式] 1.第l一6位数为行政区划代码; 2.第7-12位数为出生日期代码; 3.第13---15位数为分配顺序代码; (1).行政区划代码,是指公民第一次申领居民身份证时 ...

  8. js身份证号码验证

    验证身份证号码的有效性,包含15位和18位: 根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列 ...

  9. 从身份证号码中获取性别、出生日期、籍贯,并更新mongodb

    有这样的需求,人员信息是存在mongodb中,需要存放人员的身份证.性别.出生日期.籍贯等信息.通过脚本导入这些信息,但是只导入了身份证号码,其他信息空缺.现在需要补全其他信息. 其实身份证信息就包含 ...

随机推荐

  1. nginx添加镜像缓存 proxy_store(未完待续)

    简介:nginx proxy_store缓存的结果,就是按照服务器的目录设置,直接缓存文件到同样的目录,像镜像一样. 遇到的问题:当服务器需要缓存的文件过大,恰巧此时没有缓存,但是有很多用户同时访问此 ...

  2. Linux第七次实验笔记

    #期中总结 习题总结与分析 填空:Linux Bash中,Ctrl+a快捷键的作用是(将光标移至输入行头,相当于Home键). [ctrl]+u 从游标处向前删除指令串 [ctrl]+k 从游标处向后 ...

  3. 客户端禁用cookies后session是否还起效果

    设置session和cookies的代码(webform1.aspx) if (txtName.Text == "wlzcool") { Session["uid&quo ...

  4. 如何抛出未认证(Unauthorized=401)异常代码

    throw new System.ServiceModel.Web.WebFaultException<string>("\"mes\":\"认证信 ...

  5. Github个人使用经历

    Github是什么? 简单来说Git是一个分布式的版本控制系统.GitHub可以托管各种git库,并提供一个web界面,但与其它像 SourceForge或Google Code这样的服务不同,Git ...

  6. 你所不知道的Python奇技淫巧

    有时候你会看到很Cool的Python代码,你惊讶于它的简洁,它的优雅,你不由自主地赞叹:竟然还能这样写.其实,这些优雅的代码都要归功于Python的特性,只要你能掌握这些Pythonic的技巧,你一 ...

  7. Newtonsoft.Json之JArray, JObject, JPropertyJValue

    JObject staff = new JObject(); staff.Add(new JProperty("Name", "Jack")); staff.A ...

  8. sql server 数据库备份,完整备份,差异备份,自动备份说明

    Sql server 设置完整备份,差异备份说明 在数据库管理器中,选择要备份的数据库,右键找到“备份” 然后可以按照备份的方式进行备份. 关于文件的还原,作以下补充说明: 步骤为: 1.在需要还原的 ...

  9. Jquery-EasyUI学习~

    为了回顾,简单记录下EasyUI如何使用: 先来张效果图: 这张图是从后台获取数据,然后进行展示的. 我这里利用的是EF-MVC. 先说下View视图里面的HTML代码是如何写的: @{ ViewBa ...

  10. localStorage和sessionStorage的区别

    //在chrome测试的结果; 知识点1:localStorage和sessionStorage的区别; localStorage生命周期是永久,这意味着除非用户显示在浏览器提供的UI上清除local ...