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(字符串) 将数字字符转换为实际的数字

异常类源码

cs 复制代码
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;
            }
        }
    }
}

主函数源码

cs 复制代码
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);//弹出错误原因
            }
            
        }
    }
}

设计窗口

相关推荐
yufei-coder2 小时前
C# Windows 窗体开发基础
vscode·microsoft·c#·visual studio
dangoxiba3 小时前
[Unity Demo]从零开始制作空洞骑士Hollow Knight第十三集:制作小骑士的接触地刺复活机制以及完善地图的可交互对象
游戏·unity·visualstudio·c#·游戏引擎
AitTech3 小时前
深入理解C#中的TimeSpan结构体:创建、访问、计算与格式化
开发语言·数据库·c#
hiyo5856 小时前
C#中虚函数和抽象函数的概念
开发语言·c#
开心工作室_kaic9 小时前
基于微信小程序的校园失物招领系统的设计与实现(论文+源码)_kaic
c语言·javascript·数据库·vue.js·c#·旅游·actionscript
时光追逐者13 小时前
WaterCloud:一套基于.NET 8.0 + LayUI的快速开发框架,完全开源免费!
前端·microsoft·开源·c#·.net·layui·.netcore
friklogff14 小时前
【C#生态园】打造现代化跨平台应用:深度解析.NET桌面应用工具
开发语言·c#·.net
hiyo5851 天前
C#的面向对象
开发语言·c#
新手unity自用笔记1 天前
项目-坦克大战笔记-子弹的生成
笔记·学习·c#
中游鱼1 天前
Visual Studio C# 编写加密火星坐标转换
kotlin·c#·visual studio