ios严格检验身份证号码有效性
+ (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严格检验身份证号码有效性的更多相关文章
- Python实现身份证号码有效性验证
# -*- coding: utf-8 -*- import re #Errors=['验证通过!','身份证号码位数不对!','身份证号码出生日期超出范围或含有非法字符!','身份证号码校验错误!' ...
- JavaScript身份证号码有效性验证
最近需要对身份证合法性进行验证,实名验证是不指望了,不过原来的验证规则太过简单,只是简单的验证了身份证长度,现在业务需要加强下身份证验证规则,网上找到了不少资料,不过都不合偶的心意,无奈只好直接写一个 ...
- php验证身份证号码有效性
<?php // 18位身份证校验码有效性检查 // idcard_checksum18('...'); function idcard_checksum18($idcard) { if (st ...
- IOS 根据身份证号码获取 年龄 生日 性别
/** 从身份证上获取年龄 18位身份证 */ -(NSString *)getIdentityCardAge:(NSString *)numberStr { NSDateFormatter *for ...
- iOS身份证号码识别
一.前言 身份证识别,又称OCR技术.OCR技术是光学字符识别的缩写,是通过扫描等光学输入方式将各种票据.报刊.书籍.文稿及其它印刷品的文字转化为图像信息,再利用文字识别技术将图像信息转化为可以使 ...
- php验证身份证号码正确性
发布:JB01 来源:脚本学堂 [大 中 小] 分享一例php代码,用于验证身份证号码的正确性,用到了preg_match.preg_replace函数,有需要的朋友可以参考学习下.本文转 ...
- 输入身份证号码自动读取生日与性别(delphi)
一.格式介绍: [15位号码格式] 1.第l一6位数为行政区划代码; 2.第7-12位数为出生日期代码; 3.第13---15位数为分配顺序代码; (1).行政区划代码,是指公民第一次申领居民身份证时 ...
- js身份证号码验证
验证身份证号码的有效性,包含15位和18位: 根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列 ...
- 从身份证号码中获取性别、出生日期、籍贯,并更新mongodb
有这样的需求,人员信息是存在mongodb中,需要存放人员的身份证.性别.出生日期.籍贯等信息.通过脚本导入这些信息,但是只导入了身份证号码,其他信息空缺.现在需要补全其他信息. 其实身份证信息就包含 ...
随机推荐
- Android-MediaProvider数据库模式
原文地址:http://www.otechu.me/zh/2011/10/schema-of-android-mediaprovider-database/ 摘要: Android MediaProv ...
- 淘宝账号基于OAuth2.0的登录验证授权登陆第三方网站
首先得有一个注册的appkey和App Secret 该流程分三个步骤: 第一步:通过用户授权获取授权码Code: 第二步:用上一步获取的Code和应用密钥(AppSecret)通过Https P ...
- .net面试题(.Net+Html+Javascript)
.net方面 1.简述 private. protected. public. internal 修饰符的访问权限. 2.override与重载的区别 3..net值类型和引用类型的区别,写出代码样例 ...
- 在windows下python,pip,numpy,scipy,matplotlib的安装
系统:win7(64bit) 如果只需要安装python,执行步骤一就可以了,不用管后面.如果还需要其它的库,则只需要执行第二步,第一步可省略(因为在安装anaconda的时间,python就自动装好 ...
- 利用JS跨域做一个简单的页面访问统计系统
其实在大部分互联网web产品中,我们通常会用百度统计或者谷歌统计分析系统,通过在程序中引入特定的JS脚本,然后便可以在这些统计系统中看到自己网站页面具体的访问情况.但是有些时候,由于一些特殊情况,我们 ...
- CMD命令下对文件夹进行权限处理 转
保证自己的磁盘分区格式是NTFS.FAT32是不行的. 一.Cacls.exe命令的使用 这是一个在Windows 2000/XP/Server 2003操作系统下都可以使用的命令,作用是显示或者修改 ...
- form表单用ge方式提交时ie显示中文参数乱码
有网友说 通过给form表单添加accept-charset="gb2312"和 onsubmit="document.charset='gb2312'" 但这 ...
- 5、面向对象以及winform的简单运用(方法重载、隐藏、重写与虚方法)
方法的重载: 规定一个方法可以具有不同的实现,但方法的名称是相同的.如: //同样是Man这个方法 public int Man(int age,int name) { …… } //重载 publi ...
- 第一节Unity3D简介
Unity是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎.Unity ...
- Linux下安装项目管理工具Redmine
http://www.redmine.org.cn/download Linux下安装项目管理工具Redmine1.Ruby安装Ruby on Rails网站推荐使用1.8.7版. 点击(此处)折叠或 ...