iOS判断身份证号码是否正确的方法

iOS判断身份证号码是否正确的方法

在iOS开发中,判断身份证号码是否正确是非常常见的需求。它涉及到身份证号码的规则校验和部分解析。以下是判断身份证号码是否正确的方法:

校验规则

首先,我们需要了解身份证号码的校验规则。根据国家标准《GB 11643-1999》规定,身份证号码共计18位,其中前17位为地区码和出生日期码,第18位为校验位。其中,校验位的计算规则如下:

  1. 将前17位数字分别乘以对应的系数,相加得到结果;
  2. 将结果除以11,得到余数;
  3. 根据余数查找校验码表,得到校验位。

校验码表如下:

余数 校验码
0 1
1 0
2 X
3 9
4 8
5 7
6 6
7 5
8 4
9 3
10 2

校验代码

在了解校验规则后,我们可以编写校验代码。以下是校验代码的实现:

- (BOOL)validateIDCardNumber:(NSString *)value {
    // 判断位数是否合法
    if ([value length] != 18) {
        return NO;
    }
    // 判断地区码是否合法
    NSArray *areaCodes = [self areaCodeList];
    NSString *areaCode = [value substringToIndex:6];
    BOOL isValidAreaCode = [areaCodes containsObject:areaCode];
    if (!isValidAreaCode) {
        return NO;
    }
    // 判断出生日期码是否合法
    NSString *birthDateCode = [value substringWithRange:NSMakeRange(6, 8)];
    BOOL isValidBirthDateCode = [self validateBirthDateCode:birthDateCode];
    if (!isValidBirthDateCode) {
        return NO;
    }
    // 判断校验位是否合法
    NSString *checkCode = [value substringFromIndex:17];
    BOOL isValidCheckCode = [self validateCheckCode:value];
    if (!isValidCheckCode) {
        return NO;
    }
    return YES;
}

- (NSArray *)areaCodeList {
    // 地区码列表
    return @[@"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", @"710000", @"810000", @"820000"];
}

- (BOOL)validateBirthDateCode:(NSString *)value {
    // NSDateFormatter解析日期
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.dateFormat = @"yyyyMMdd";
    formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
    NSDate *date = [formatter dateFromString:value];
    // 判断是否解析成功且与当前日期相比是否早于当前日期
    if (date != nil && [date compare:[NSDate date]] == NSOrderedAscending) {
        return YES;
    } else {
        return NO;
    }
}

- (BOOL)validateCheckCode:(NSString *)value {
    // 根据规则计算校验位
    NSArray *factors = @[@7, @9, @10, @5, @8, @4, @2, @1, @6, @3, @7, @9, @10, @5, @8, @4, @2];
    NSInteger sum = 0;
    for (int i = 0; i < 17; i++) {
        int digit = [[value substringWithRange:NSMakeRange(i, 1)] intValue];
        int factor = [factors[i] intValue];
        sum += digit * factor;
    }
    NSInteger remainder = sum % 11;
    NSArray *checkCodes = @[@"1", @"0", @"X", @"9", @"8", @"7", @"6", @"5", @"4", @"3", @"2"];
    NSString *checkCode = checkCodes[remainder];
    // 判断校验位是否匹配
    if ([checkCode isEqualToString:[value substringFromIndex:17]]) {
        return YES;
    } else {
        return NO;
    }
}

在上面的代码中,我们实现了三个方法:

  • validateIDCardNumber::用于判断身份证号码是否正确,其中会调用下面两个方法;
  • validateBirthDateCode::用于判断出生日期码是否合法;
  • validateCheckCode::用于判断校验位是否合法。

示例说明

下面我们来通过两个示例说明身份证号码的校验。

示例一

对于身份证号码610404194404038238,校验的结果应该为正确。

BOOL isValid = [self validateIDCardNumber:@"610404194404038238"];
NSLog(@"%@", isValid ? @"正确" : @"错误"); // 输出:正确

示例二

对于身份证号码110000194912310077,校验的结果应该为错误。

BOOL isValid = [self validateIDCardNumber:@"110000194912310077"];
NSLog(@"%@", isValid ? @"正确" : @"错误"); // 输出:错误

通过上述代码和示例说明,我们可以看出,判断身份证号码是否正确并不复杂,只需要按照规则进行校验即可。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:iOS判断身份证号码是否正确的方法 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • 浅谈swoole的作用与原理

    浅谈 Swoole 的作用与原理 Swoole 是一款基于 PHP 的协程网络通信引擎,其主要作用是提供异步、高并发的网络通信能力。本文将介绍 Swoole 的作用和原理,并提供两个示例说明。 Swoole 的作用 Swoole 主要用于处理服务器端的网络通信,包括但不限于以下几个方面: 提供异步事件驱动的编程模型,相较于传统的编程模型,更加高效,性能更好;…

    人工智能概览 2023年5月25日
    00
  • Python提取频域特征知识点浅析

    请允许我详细讲解 “Python提取频域特征知识点浅析” 的完整攻略。 一、前言 频域特征提取是信号处理中的一个重要步骤,它允许我们将一个时域信号转换到一个频域信号,这样我们就可以通过频率分析获得更多关于信号特征的信息。Python中有很多强大的工具用于频域分析。 二、Python中的频域分析工具 1. NumPy和SciPy NumPy和SciPy是Pyt…

    人工智能概览 2023年5月25日
    00
  • Go语言七篇入门教程一简介初识

    Go语言七篇入门教程一简介初识 前言 本文是对Go语言的初步介绍,旨在帮助初学者了解Go语言的基础知识和一些最佳实践技巧。这篇文章也是本系列教程的第一篇,接下来我们将深入学习Go语言的各种特性和用法。 环境设置 在开始学习Go语言之前,需要先搭建起适合自己的开发环境。以下是搭建开发环境的简易步骤: 下载并安装Go语言环境:请到官网 https://golan…

    人工智能概览 2023年5月25日
    00
  • Unity接入百度AI实现果蔬识别

    为了让大家能够更好地接入百度AI实现果蔬识别,本篇将给出Unity接入百度AI的完整攻略,包含以下几步: 注册百度智能云账号 创建应用并获取API Key和Secret Key 下载并导入官方SDK 编写代码实现果蔬识别 接下来,我们将逐一讲解这些步骤。 1. 注册百度智能云账号 首先,我们需要注册一个百度智能云账号。打开百度智能云官网,点击“注册”按钮,填…

    人工智能概论 2023年5月25日
    00
  • 在表单提交前进行验证的几种方式整理

    以下是在表单提交前进行验证的几种方式整理: 1. 客户端验证 客户端验证是一种通过JavaScript在客户端对表单进行校验的方式。使用此方式可以给用户提供实时反馈。使用客户端验证的弊端是,由于每个浏览器都有自己的JavaScript引擎,因此需要在不同浏览器上进行测试,并且JavaScript可以被禁用,导致验证无效。 以下是一个使用jQuery实现的客户…

    人工智能概论 2023年5月25日
    00
  • 利用nginx解决cookie跨域访问的方法

    下面是利用Nginx解决Cookie跨域访问的方法的完整攻略: 什么是Cookie跨域? 当一个网站向另一个域名的网站发送请求时,当前网站在请求中会携带Cookie信息。这种情况下,另一个域名的网站将无法获取Cookie信息,从而导致跨域问题。 使用Nginx解决Cookie跨域问题 Nginx是一款高性能的HTTP服务器和反向代理服务器,可以用来作为解决C…

    人工智能概览 2023年5月25日
    00
  • 关于Django ForeignKey 反向查询中filter和_set的效率对比详解

    标题:关于Django ForeignKey 反向查询中filter和_set的效率对比详解 介绍 在Django中,ForeignKey是一种非常常见的关系,其反向查询也是经常被用到的。在进行反向查询时,通常会使用filter或者_set来获取相关的数据对象,但是这两种方法哪一种更高效呢?本攻略将详细讲解这个问题。 什么是filter和_set filte…

    人工智能概览 2023年5月25日
    00
  • Django动态随机生成温度前端实时动态展示源码示例

    以下是详细的讲解“Django动态随机生成温度前端实时动态展示源码示例”的完整攻略。 简介 本攻略将通过Django框架实现动态随机生成温度并通过前端实时动态展示,主要包含以下步骤: 创建Django项目并创建渲染模板 后端实现动态随机生成温度并将结果传递至渲染模板 前端实现实时动态展示温度 步骤一:创建Django项目及模板 首先需要创建一个Django项…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部