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

+ (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;
}
时间: 2024-12-25 23:37:45

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

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

/** 从身份证上获取年龄 18位身份证 */ -(NSString *)getIdentityCardAge:(NSString *)numberStr { NSDateFormatter *formatterTow = [[NSDateFormatter alloc]init]; [formatterTow setDateFormat:@"yyyy-MM-dd"]; NSDate *bsyDate = [formatterTow dateFromString:[self birth

常用js工具类之关于身份证号码验证的几个实用函数

身份证号码有效性验证 function isIDCard(idcard) { idcard = idcard.toUpperCase(); // 对身份证号码做处理 var ereg; var Y, JYM; var S, M; /*基本校验*/ //if (String.isNullOrEmpty(idcard)) return false; var idcard_array = new Array(); idcard_array = idcard.split(""); /*身份号码

iOS身份证号码识别

一.前言 ??身份证识别,又称OCR技术.OCR技术是光学字符识别的缩写,是通过扫描等光学输入方式将各种票据.报刊.书籍.文稿及其它印刷品的文字转化为图像信息,再利用文字识别技术将图像信息转化为可以使用的计算机输入技术. ??因为项目需要,所以这些天查阅了相关资料,想在网上看看有没有大神封装的现成的demo可以用.但是无果,网上关于ocr这一块的资料很少,比较靠谱的都是要收费的,而且价格也不便宜.但是在天朝,收费感觉心里不爽,所以就决定自己研究一番. ??先上一个最终实现的效果(如果mac不是r

详细验证身份证号码规则和姓名(汉字)的java代码

一.验证汉字的正则表达式 /** 是否是汉字的正则 */ private String regexIsHanZi = "[\\u4e00-\\u9fa5]+"; * @param str要匹配的字符串 * @param reg 正则 public static boolean matchRegular(String str, String reg) { Pattern pattern = Pattern.compile(reg); Matcher matcher = pattern.m

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

一.格式介绍: [15位号码格式] 1.第l一6位数为行政区划代码; 2.第7-12位数为出生日期代码; 3.第13---15位数为分配顺序代码; (1).行政区划代码,是指公民第一次申领居民身份证时的常住户口所在地的行政地区. (2).出生日期代码,第7-8位数代表年份(年份前面二位数省略),第9-10位数代表月份(月份为l位数的前面加零).第11一12位数代表日期(日期为1位数的前面加零). (3).分配顺序代码,是按人口数统一合理分配以固定顺序给予每个人的顺序号,最末一位数是奇数的分配给男

破解火车票上的身份证号码

首先我在百度上找到了一个他人的火车票图片 接着从图片里我们可以获取到信息如下: 姓名 梅勇性别 男 (倒数第四位至倒数第二位3位数为顺序码,顺序码为奇数所以为男性)(可参考http://www.cnblogs.com/xudong-bupt/p/3293838.html)来自 武汉市新洲区 (身份证号码前六位代表地区)(可参考http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/200406/t20040607_38302.html) 身份证号码:4201171988

15/18位身份证号码验证的正则表达式总结(详细版)

前言 开发过程中,常常需要对一些输入信息进行有效性验证,使用正则表达式进行校验是最简单.效率最高的方式了,下面就来看看15/18位身份证号码验证的正则表达式吧. 介绍 xxxxxx yyyy MM dd 375 0     十八位 xxxxxx    yy MM dd   75 0     十五位 地区: [1-9]\d{5} 年的前两位: (18|19|([23]\d))            1800-2399 年的后两位: \d{2} 月份: ((0[1-9])|(10|11|12)) 天

算法提高 身份证号码升级

问题描述 从1999年10月1日开始,公民身份证号码由15位数字增至18位.(18位身份证号码简介).升级方法为: 1.把15位身份证号码中的年份由2位(7,8位)改为四位. 2.最后添加一位验证码.验证码的计算方案: 将前 17 位分别乘以对应系数 (7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2) 并相加,然后除以 11 取余数,0-10 分别对应 1 0 x 9 8 7 6 5 4 3 2. 请编写一个程序,用户输入15位身份证号码,程序生成18位身份证号码.假设所

例题:输入身份证号码,判断你是什么生肖。switch,case练习,substring 类使用联系,会用取余

Console.WriteLine("请输入您的身份证号码"); string x = Console.ReadLine(); string year=x.Substring (6,4);//从身份证的第六位开始截取,往后截取四位,就是你的出生年份 int x1 = Convert.ToInt32(year);//把截取到年份代入到x1中, string sx = ""; switch(x1%12)//输入一个年份取余,如果假设取余为四,你能判断那年的生肖,然后根据