c# 版 18位身份证严格验证及 15位转18位

简介: private string GetCard(string cid)        {            if (cid.

private string GetCard(string cid)
        {
            if (cid.Length == 15)
            {
                cid = per15To18(cid);
            }
            string[] aCity = new string[]{null,null,null,null,null,null,null,null,null,null,null,"
北京","天津","河北","山西","内蒙古",null,null,null,null,null,"辽宁","吉林","黑龙江",null,null,null,null,null,null,null,"上海","江苏","浙江","安微","福建","江西","山东",null,null,null,"河南","湖北","湖南","广东","广西","海南",null,null,null,"重庆","四川","贵州","云南","西藏",null,null,null,null,null,null,"陕西","甘肃","青海","宁夏","***",null,null,null,null,null,"台湾",null,null,null,null,null,null,null,null,null,"香港","澳门",null,null,null,null,null,null,null,null,"国外
"};
            double iSum=0;
            //string info="";
            System.Text.RegularExpressions.Regex rg = new System.Text.RegularExpressions.Regex(@"^/d{17}(/d|x)$");
            System.Text.RegularExpressions.Match mc = rg.Match(cid);
            if(!mc.Success)
            {
               // return "
格式不正确
!";
                return "";
            }
            cid = cid.ToLower();
            cid = cid.Replace("x","a");
            if(aCity[int.Parse(cid.Substring(0,2))]==null)
            {
                //return "
非法地区
";
                return "";
            }
            try
            {
                 DateTime.Parse(cid.Substring(6,4)+"-"+cid.Substring(10,2)+"-"+cid.Substring(12,2));
            }
            catch
            {
                 //return "
非法生日
";
                 return "";
            }
            for(int i=17;i>=0;i--)
            {
                iSum +=(System.Math.Pow(2,i)%11)*int.Parse(cid[17-i].ToString(),System.Globalization.NumberStyles.HexNumber);

            }
            if(iSum%11!=1)
                //return("
非法证号
");
                return("");

            return(cid.Substring(6,4)+"-"+cid.Substring(10,2)+"-"+cid.Substring(12,2));

        }

private string per15To18(string perIDSrc)
        {
            int iS = 0;

            //加权因子常数
            int[] iW = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
            //
校验码常数

            string LastCode = "10X98765432";
            //
新身份证号

            string perIDNew;

            perIDNew = perIDSrc.Substring(0, 6);
            //
填在第6位及第7位上填上‘1’‘9’两个数字

            perIDNew += "19";
            perIDNew += perIDSrc.Substring(6, 9);
            //
进行加权求和

            for (int i = 0; i < 17; i++)
            {
                iS += int.Parse(perIDNew.Substring(i, 1)) * iW[i];
            }

            //取模运算,得到模值
            int iY = iS % 11;
            //
LastCode中取得以模为索引号的值,加到身份证的最后一位,即为新身份证号。

            perIDNew += LastCode.Substring(iY, 1);

            return perIDNew;
        }

转载他处,地址不详,以备不时之需。

相关文章
|
人工智能 网络协议 C#
验证(C#和正则表达式)
原文: 验证(C#和正则表达式) 我们经常会需要验证字符串的格式,比如密码长度范围、电子邮件格式、固定电话号码和手机号码格式等,这个时候我们经常会需要用到正则表达式。
971 0
|
C# 算法 数据安全/隐私保护
基于RSA的数字签名和验证C#源码
/**//* 基于RSA的数字签名和验证C#源码 * (采用字符串作为参数)RSA_Demo3 *  * 夏春涛 Email:xChuntao@163.com  * Blog:http://bluesky521.cnblogs.com * 运行环境:.net2.0 framework *//**//* 备注: * 若要使用公钥系统对消息进行数字签名,发送方先向该消息应用哈希函数以创建消息摘要。
1414 0
|
4月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
159 3
|
4月前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
177 3
|
4天前
|
安全 程序员 编译器
C#一分钟浅谈:泛型编程基础
在现代软件开发中,泛型编程是一项关键技能,它使开发者能够编写类型安全且可重用的代码。C# 自 2.0 版本起支持泛型编程,本文将从基础概念入手,逐步深入探讨 C# 中的泛型,并通过具体实例帮助理解常见问题及其解决方法。泛型通过类型参数替代具体类型,提高了代码复用性和类型安全性,减少了运行时性能开销。文章详细介绍了如何定义泛型类和方法,并讨论了常见的易错点及解决方案,帮助读者更好地掌握这一技术。
20 11