idchk.cs

来自「嵌入式开发从基础到提高」· CS 代码 · 共 227 行

CS
227
字号
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace IDChecker
{
    class IdChk
    {
        public static void Msg(string strMsg,int intMsg)
             //本类的目的是为了显示格式一致的消息框,两个参数,strMsg是消
             //息框中显示的文字内容,intMsg是消息框的类型intMsg为1时,弹出
             //一个带有一个OK按钮和黄色三角警示符号的消息框,intMsg为2时,
             //弹出一个带有一个YES和一个NO按钮和问号的消息框。intMsg为3时,
             //弹出一个带有一个OK按钮和字符i图标符号的消息框。
        {
            switch (intMsg)
                    //所需指定输出对话框的类型不同而弹出不同的对话框
            {
                case 1:
                    MessageBox.Show(strMsg, "ID Checker", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1); ;
                    break;
                case 2:
                    MessageBox.Show(strMsg, "ID Checker", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
                    break;
                default:
                    MessageBox.Show(strMsg, "ID Checker", MessageBoxButtons.OK, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1);
                    break;
            }
        }
        public static byte ischarlegal(string strIDEachBit)
            //对某个字符的合法性进行检查,如果字符是数字,返回1,如果字符
            //是数字或者X,则返回2,如果字符既非数字,又非X,则返回0。
        {
            if (strIDEachBit.Length == 1)
                //先判断传入的字符串是否只含有一个字符
            {
                int intTemp = Convert.ToChar(strIDEachBit);
                //将其转换为其相应的ASCII码值
                switch (intTemp)
                {
                    case 48:
                    case 49:
                    case 50:
                    case 51:
                    case 52:
                    case 53:
                    case 54:
                    case 55:
                    case 56:
                    case 57:
                        //如果是0~9的数字,则返回1
                        return 1;
                    case 88:
                    case 120:
                        //如果是X或者x,则返回2
                        return 2;
                    default:
                        //如果是非数字或者X、x,则返回0
                        return 0;
                }
            }
            else
            {
                return 0;
            }
        }
        public static byte is18ChkNumRight(ref string strID)
            //通过输入的前17位计算得到一个值,再与输入的第18位进行比较,
            //如果相等则返回1,否则返回0。
        {
            int[] intEachNum = new int[17];
            //声明一个用来存储前17位上数字的数组
            int intSum = 0;
            //用于存储计算校验码的和
            int intChkCalcNum = 0;
            //用于存储通过前17位数字计算得到的校验码
            for (int i = 0; i < 17; i++)
            {
                intEachNum[i] = Convert.ToChar(strID.Substring(i, 1)) - 48;
                //将相应的字符串先显式转换为字符,再隐式转换为数字
                switch ((i + 1) % 10)
                        //对于处于不同位上的数字乘以相应的权,再相加
                {
                    case 0:
                        intSum = intSum + intEachNum[i] * 3;
                        break;
                    case 1:
                        intSum = intSum + intEachNum[i] * 7;
                        break;
                    case 2:
                        intSum = intSum + intEachNum[i] * 9;
                        break;
                    case 3:
                        intSum = intSum + intEachNum[i] * 10;
                        break;
                    case 4:
                        intSum = intSum + intEachNum[i] * 5;
                        break;
                    case 5:
                        intSum = intSum + intEachNum[i] * 8;
                        break;
                    case 6:
                        intSum = intSum + intEachNum[i] * 4;
                        break;
                    case 7:
                        intSum = intSum + intEachNum[i] * 2;
                        break;
                    case 8:
                        intSum = intSum + intEachNum[i] * 1;
                        break;
                    case 9:
                        intSum = intSum + intEachNum[i] * 6;
                        break;
                    default:
                        break;
                }
            }
            switch (intSum % 11)
                    //根据和除以11所得余数的不同,再转换为相应的校验码
            {
                case 0:
                    intChkCalcNum = 49;
                    break;
                case 1:
                    intChkCalcNum = 48;
                    break;
                case 2:
                    intChkCalcNum = 88;
                    break;
                case 3:
                    intChkCalcNum = 57;
                    break;
                case 4:
                    intChkCalcNum = 56;
                    break;
                case 5:
                    intChkCalcNum = 55;
                    break;
                case 6:
                    intChkCalcNum = 54;
                    break;
                case 7:
                    intChkCalcNum = 53;
                    break;
                case 8:
                    intChkCalcNum = 52;
                    break;
                case 9:
                    intChkCalcNum = 51;
                    break;
                case 10:
                    intChkCalcNum = 50;
                    break;
                default:
                    break;
            }
            int intChkInputNum = Convert.ToChar(strID.Substring(17, 1));
            //存储从传入的18位码中取最后一位码得到的校验码
            if ((intChkCalcNum == intChkInputNum) || (intChkInputNum == 120))
                //将两种不同方式得到的校验码进行对比,如果相同,则返回1,否则返回0
            {
                return 1;
            }
            else
            {
                return 0;
            }
        }
        public static byte is17DateRight(string strPro17)
            //检查输入的17位号码的日期是否合法,如果合法则返回1,否则返回
            //0
        {
            int intYear = Convert.ToInt32(strPro17.Substring(6, 4));
            //存储从标准17位码中得到的相应的出生年信息
            int intMon = Convert.ToInt32(strPro17.Substring(10, 2));
            //存储从标准17位码中得到的相应的出月年信息
            int intDay = Convert.ToInt32(strPro17.Substring(12, 2));
            //存储从标准17位码中得到的相应的出日年信息
            if (intYear > 1850 && intYear <= DateTime.Now.Year)
            //年被在1850~现在之间,如果超出这个范围,则提示出生年月日信息不合法
            {
                if (intMon > 0 && intMon < 13)
                //月在1~12间之间,如果超出这个范围,则提示出生年月日信息不合法
                {
                    if (intDay > 0 && intDay < 32)
                    //日期在1~31之间,如果超出这个范围,则提示出生年月日信息不合法
                    {
                        if (intMon == 1 || intMon == 3 || intMon == 5 || intMon == 7 || intMon == 8 || intMon == 10 || intMon == 12)
                        //如果是阳历,则日期不能超过31,否则提示出生年月日信息不合法
                        {
                            return 1;
                        }
                        else if ((intMon == 4 || intMon == 6 || intMon == 9 || intMon == 11) && intDay < 31)
                        //如果是4、6、9、11月,则日期不能超过30,否则提示出生年月日信息不合法
                        {
                            return 1;
                        }
                        else if ((intYear % 4 == 0) && intYear != 2000 && intDay < 30 || intDay < 29)
                        //如果是非闰年的2月,且不是2000年时候,则日期不能超过28天
                        {
                            return 1;
                        }
                        else
                            //闰年的2月可以是29天
                        {
                            return 0;
                        }
                    }
                    else
                    {
                        return 0;
                    }
                }
                else
                {
                    return 0;
                }
            }
            else
            {
                return 0;
            }
        }
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?