C#实现身份证格式验证(自建异常实现提醒)

基本信息

        

中国居民身份证的格式包括18位数字,这些数字分别代表不同的信息:

第1、2位数字表示省份代码。
第3、4位数字表示城市代码。
第5、6位数字表示区县代码。
第7至14位数字表示出生年、月、日(其中7、8、9、10位是年,11、12位是月,13、14位是日)。
第15至17位数字是顺序码,用于标识同一地址辖区内同年同月同日出生的人,同时第17位兼具性别标识功能,男性为奇数,女性为偶数。
第18位数字是校验码,可以是0-9的数字,有时也用X表示。
此外,身份证的正面包含国徽、证件名称、签发机关(第一代用印章形式,第二代用文字形式)、证件的有效期限等信息。反面则包括持证人的姓名、性别、民族、出生日期、住址以及18位公民身份号码

中国居民身份证的最后一位校验码用于验证身份证号码的正确性。这个校验码是通过将身份证号码前17位数字分别乘以不同的系数,然后求和,并对11取余数得到的。具体步骤如下:

将身份证号码前17位分别乘以对应的系数。系数是一个从左到右递增的序列:7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2。
计算乘积的和。
将这个和除以11,得到余数。
根据余数通过一个查表的方式确定校验码。余数对应的校验码如下:
余数为0时,校验码为1。
余数为1时,校验码为0。
余数为2时,校验码为X。
余数为3时,校验码为9。
余数为4时,校验码为8。
余数为5时,校验码为7。
余数为6时,校验码为6。
余数为7时,校验码为5。
余数为8时,校验码为4。
余数为9时,校验码为3。
余数为10时,校验码为2。
如果计算出的校验码与身份证上的校验码相符,那么身份证号码就是有效的。如果不符合,那么身份证号码可能输入错误或者不是有效的身份证号码。

思路

1比对个数

2判断最后一个是X或x或数字

3判断前17为是不是数字

4计算并校验身份证是否有效

使用到的函数

char.IsDigit(字符)//判断字符是否为数字字符为字符则为true;

.Length      计算字符长度

Convert.ToInt32(字符串)     将数字字符转换为实际的数字

异常类源码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 号码识别
{
    class Yi_chang:Exception
    {
        public Yi_chang(string message) : base(message)
        {
        }
    }
    public class person {
        public void a(string a2) {
            //判断个数和最后一个字符格式是否正确
            if (a2.Length != 18)
            {
                throw new Yi_chang("个数不对");
            }
            else if (char.IsDigit(a2[17])!=true)
            {
                if (a2[17] != 'X' & a2[17] != 'x')
                {
                    throw new Yi_chang("最后一个字符格式错误");
                }
            }
            
            
            //判断前17个字符是否为数字
            
            
            if (char.IsDigit(a2[0]) != true) {
                throw new Yi_chang("第1个字符格式错误");
            }
            else if (char.IsDigit(a2[1]) != true)
            {
                throw new Yi_chang("第2个字符格式错误");
            }
            else if (char.IsDigit(a2[2]) != true)
            {
                throw new Yi_chang("第3个字符格式错误");
            }
            else if (char.IsDigit(a2[3]) != true)
            {
                throw new Yi_chang("第4个字符格式错误");
            }
            else if (char.IsDigit(a2[4]) != true)
            {
                throw new Yi_chang("第5个字符格式错误");
            }
            else if (char.IsDigit(a2[5]) != true)
            {
                throw new Yi_chang("第6个字符格式错误");
            }
            else if (char.IsDigit(a2[6]) != true)
            {
                throw new Yi_chang("第7个字符格式错误");
            }
            else if (char.IsDigit(a2[7]) != true)
            {
                throw new Yi_chang("第8个字符格式错误");
            }
            else if (char.IsDigit(a2[8]) != true)
            {
                throw new Yi_chang("第9个字符格式错误");
            }
            else if (char.IsDigit(a2[9]) != true)
            {
                throw new Yi_chang("第10个字符格式错误");
            }
            else if (char.IsDigit(a2[10]) != true)
            {
                throw new Yi_chang("第11个字符格式错误");
            }
            else if (char.IsDigit(a2[11]) != true)
            {
                throw new Yi_chang("第12个字符格式错误");
            }
            else if (char.IsDigit(a2[12]) != true)
            {
                throw new Yi_chang("第13个字符格式错误");
            }
            else if (char.IsDigit(a2[13]) != true)
            {
                throw new Yi_chang("第14个字符格式错误");
            }
            else if (char.IsDigit(a2[14]) != true)
            {
                throw new Yi_chang("第15个字符格式错误");
            }
            else if (char.IsDigit(a2[15]) != true)
            {
                throw new Yi_chang("第16个字符格式错误");
            }
            else if (char.IsDigit(a2[16]) != true)
            {
                throw new Yi_chang("第17个字符格式错误");
            }

            //根据最后一个效验码验证身份证格式
            int zhi = Convert.ToInt32(a2[0].ToString()) * 7 + Convert.ToInt32(a2[1].ToString()) * 9 + Convert.ToInt32(a2[2].ToString()) * 10 + Convert.ToInt32(a2[3].ToString()) * 5 +
                      Convert.ToInt32(a2[4].ToString()) * 8 + Convert.ToInt32(a2[5].ToString()) * 4 + Convert.ToInt32(a2[6].ToString()) * 2 + Convert.ToInt32(a2[7].ToString()) * 1 +
                      Convert.ToInt32(a2[8].ToString()) * 6 + Convert.ToInt32(a2[9].ToString()) * 3 + Convert.ToInt32(a2[10].ToString()) * 7 + Convert.ToInt32(a2[11].ToString()) * 9 +
                      Convert.ToInt32(a2[12].ToString()) * 10 + Convert.ToInt32(a2[13].ToString()) * 5 + Convert.ToInt32(a2[14].ToString()) * 8 + Convert.ToInt32(a2[15].ToString()) * 4 +
                      Convert.ToInt32(a2[16].ToString()) * 2;
            int yan = zhi % 11;
            switch (yan) {
                case 0:
                    if (a2[17] != '1')
                    {
                        throw new Yi_chang("校验失败,身份证无效");
                    }
                    break;
                case 1:
                    if (a2[17] != '0')
                    {
                        throw new Yi_chang("校验失败,身份证无效");
                    }
                    break;
                case 2:
                    if (a2[17] != 'X'& a2[17]!='x')
                    {
                        throw new Yi_chang("校验失败,身份证无效");
                    }
                    break;
                case 3:
                    if (a2[17] != '9')
                    {
                        throw new Yi_chang("校验失败,身份证无效");
                    }
                    break;
                case 4:
                    if (a2[17] != '8')
                    {
                        throw new Yi_chang("校验失败,身份证无效");
                    }
                    break;
                case 5:
                    if (a2[17] != '7')
                    {
                        throw new Yi_chang("校验失败,身份证无效");
                    }
                    break;
                case 6:
                    if (a2[17] != '6')
                    {
                        throw new Yi_chang("校验失败,身份证无效");
                    }
                    break;
                case 7:
                    if (a2[17] != '5')
                    {
                        throw new Yi_chang("校验失败,身份证无效");
                    }
                    break;
                case 8:
                    if (a2[17] != '4')
                    {
                        throw new Yi_chang("校验失败,身份证无效");
                    }
                    break;
                case 9:
                    if (a2[17] != '3')
                    {
                        throw new Yi_chang("校验失败,身份证无效");
                    }
                    break;
                case 10:
                    if (a2[17] != '2')
                    {
                        throw new Yi_chang("校验失败,身份证无效");
                    }
                    break;
            }
        }
    }
}

 主函数源码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 号码识别
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //身份号码正确则显示正确,否则将提示错误
            person age1 = new person();
            try {
                age1.a(textBox1.Text.Trim());
                label1.Text = "格式正确";
            }
            catch (Yi_chang temp) {
                MessageBox.Show(temp.Message);//弹出错误原因
            }
            
        }
    }
}

设计窗口 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/498487.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

整合SpringSecurity+JWT实现登录认证

一、关于 SpringSecurity 在 Spring Boot 出现之前,SpringSecurity 的使用场景是被另外一个安全管理框架 Shiro 牢牢霸占的,因为相对于 SpringSecurity 来说,SSM 中整合 Shiro 更加轻量级。Spring Boot 出现后,使这一情况情况大有…

python实战之PyQt5桌面软件

一. 演示效果 二. 准备工作 1. 使用pip 下载所需包 pyqt5 2. 下载可视化UI工具 QT Designer 链接:https://pan.baidu.com/s/1ic4S3ocEF90Y4L1GqYHPPA?pwdywct 提取码:ywct 3. 可视化UI工具汉化 把上面的链接打开, 里面有安装和汉化包, 前面的路径还要看…

基于SSM学生信息管理系统

采用技术 基于SSM学生信息管理系统的设计与实现~ 开发语言:Java 数据库:MySQL 技术:SpringMVCMyBatis 工具:IDEA/Ecilpse、Navicat、Maven 页面展示效果 总体功能设计 登录页面 后台首页 学生信息页面 添加学生用户 编辑…

Java代码混淆技术最佳实践与案例分享

摘要 本文探讨了代码混淆在保护Java代码安全性和知识产权方面的重要意义。通过混淆技术,可以有效防止代码被反编译、逆向工程或恶意篡改,提高代码的安全性。常见的Java代码混淆工具如IPAGuard、Allatori、DashO、Zelix KlassMaster和yGuard等&#xff0…

单链表算法库

singlelist.cpp #include "singlelist.h"/************************************************** ①函数名: CreatList_Head 功 能: 头插法建立单链表 参 数: (1)LinkList *&L: 传入的单链表指针地址(2)ElemType Array_used[]:要用来建表的数组(3)int Array_nu…

win 11环境配置 之 python(cmd 输入 python --version 输出为空)

当我安装好python后,在 cmd 终端输入 python 和 python --version 均无任何输出时,就知道有问题。 在 vscode 下载好 python插件后,编写demo文件,可以执行成功。 因此得出原因是 win 环境变量配置有问题 具体错误问题:…

BabySQL【2019极客大挑战】

知识点: 功能分析 登录界面一般是 where username and password 可以从username出手,注释掉and语句单引号闭合绕过 通过测试和报错信息发现是一个单引号读取输入可以单引号闭合绕过关键字过滤 or and 过滤 || &&替换双写绕过select from wher…

飞凌嵌入式即将亮相德国纽伦堡「Embedded World 2024」

2024年德国纽伦堡嵌入式展览会(Embedded World 2024)将于4月9日~4月11日盛大开幕,本届展会将展示最新的电子技术与应用,涵盖了半导体、嵌入式系统、电源、电池、测试仪器、智能制造、电子设计自动化等众多领域,并将汇集…

Aigtek:电压放大器对参数的要求是什么

电压放大器是一种用于增大输入信号幅度的电子设备,它在各种应用中发挥着重要的作用。为了确保电压放大器的性能和可靠性,对其参数有一定的要求。下面安泰电子将介绍电压放大器的几个关键参数,包括增益、带宽、输入/输出阻抗和噪声等&#xff…

Win10 搭建FTP存储服务器站点【超详细教程】

目录 第一步:打开控制面板>程序 第二步:win10左下角搜索IIS并打开 第三步:右键网站,选择添加FTP站点 第四步:添加FTP站点名称 第五步:添加IP地址和端口 第六步:身份验证与授权信息 第…

系统架构图怎么画

画架构图是架构师的一门必修功课。 对于架构图是什么这个问题,我们可以按以下等式进行概括: 架构图 架构的表达 架构在不同抽象角度和不同抽象层次的表达,这是一个自然而然的过程。 不是先有图再有业务流程、系统设计和领域模型等&#…

LLM2LLM: Boosting LLMs with Novel Iterative Data Enhancement

LLM2LLM: Boosting LLMs with Novel Iterative Data Enhancement 相关链接:arXiv GitHub 关键字:LLM、Data Augmentation、Fine-tuning、NLP、Low-data Regime 摘要 预训练的大型语言模型(LLMs)目前是解决绝大多数自然语言处理任…

助力低碳出行 | 基于ACM32 MCU的电动滑板车方案

前言 随着智能科技的快速发展,电动滑板车的驱动系统也得到了长足的发展。国内外的电动滑板车用电机驱动系统分为传统刷式电机和无刷电机两种类型。其中,传统的刷式电机已经逐渐被无刷电机所取代,无刷电机的性能和寿命都更出色,已成…

Uibot6.0 (RPA财务机器人师资培训第5天 ) 报销汇总机器人案例实战

训练网站:泓江科技 (lessonplan.cn)https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981https…

SAP BTP云上一个JVM与DB Connection纠缠的案例

前言 最近在CF (Cloud Foundry) 云平台上遇到一个比较经典的案例。因为牵扯到JVM (app进程)与数据库连接两大块,稍有不慎,很容易引起不快。 在云环境下,有时候相互扯皮的事蛮多。如果是DB的问题,就会找DB…

day72Html

常用标签: 分类: 块级标签:独立成行 行级标签:不独立成行,同一行可放多个行级标 注意网页显示时,忽略空白字符,(回车符,空格,tab制表符) 一)块级标签&#xf…

STM32/GD32的以太网DMA描述符

继续梳理以太网的DMA描述符。 以太网DAM描述符的结构 有两种结构,链式结构和环形结构。 常用的是链式结构。 标准库中,关于DMA描述符的数据结构 以gd32f4xx_enet.c为例。 先说发送描述符。 系统分配了5个发送描述符。每个描述符对应的缓冲区大小为152…

基于双vip+GTID的半同步主从复制集群项目(MySQL集群)

项目标题:基于keepalivedGTID的半同步主从复制MySQL集群 准备七台机器,其中有四台时MySQL服务器,搭建主从复制的集群,一个master,2个slave服务器,一个延迟备份服务器。同时延迟备份服务器也可以充当异地备…

C++ 数组

一 一维数组 1 一维数组 数组名:标识这组相同的数据的名字。 数组元素:构成数组的每个数据项。 一维数组的定义 存储类型 数据类型 数组名[正整数] float score[10]; 1 定义数组时初始化数组的方法 int a[5]{12,34,56,78,9}; int a[5]{0}; int a[]{11…

深入探讨多线程编程:从0-1为您解释多线程(下)

文章目录 6. 死锁6.1 死锁原因 6.2 避免死锁的方法加锁顺序一致性。超时机制。死锁检测和解除机制。 6. 死锁 6.1 死锁 原因 系统资源的竞争:(产生环路)当系统中供多个进程共享的资源数量不足以满足进程的需要时,会引起进程对2…