生成IDCARD号码C#版
【摘要】 在网上找了好几个生成器用于业务测试,但却没有一个用起顺手,甚至这么简单的功能都带广告......干脆自己动手写一个!
在网上找了好几个生成器用于业务测试,但却没有一个用起顺手,甚至这么简单的功能都带广告......
干脆自己动手写一个!
核心代码:
/// <summary> /// 生成IDCARD号码C#版,用于业务测试,请勿用于非法用途 /// By motozilog /// 2019-01-02 /// </summary> /// <param name="address">地址码:全国行政区划数字代码【GB/T2260】</param> /// <param name="birthday">出生日期:GBT 7408-2005数据和交换格式 信息交换 日期和时间表示法(即yyyyMMdd)</param> /// <param name="man">是否为男性</param> /// <seealso cref="https://mp.weixin.qq.com/s/YEBmaV3d7zF_fJZ3ESq8xw" 56行Python代码实现身份证字典生成器/> /// <returns></returns> private HashSet<string> genIdcards(string address,string birthday,bool man) { int[] ratios = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };//1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ; int[] remains = new int[] { 1, 0, 11, 9, 8, 7, 6, 5, 4, 3, 2 }; HashSet<string> idcards = new HashSet<string>(); //通过穷举获取 for (int id = 1; id <= 999; id++) { string idcard = address + birthday + id.ToString("000"); int sum = 0; //1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ; for (int i = 0; i < idcard.Length; i++) { int bit = Convert.ToInt32(idcard.Substring(i, 1)) * ratios[i]; //2、将这17位数字和系数相乘的结果相加; sum = sum + bit; } //3、用加出来和除以11,看余数是多少;余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2; int remain = remains[sum % 11]; if (man == true && (remain % 2 == 1)) { //男性为偶数 idcard = idcard + ((remain == 11) ? "X" : remain.ToString("0")); //如果为11则转换成X idcards.Add(idcard); } else if (man == false && (remain % 2 == 0)) { //女性为偶数 idcard = idcard + ((remain == 11) ? "X" : remain.ToString("0")); //如果为11则转换成X idcards.Add(idcard); } } return idcards; }
再做个界面
完整代码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace 号码生成 { public partial class Form1 : Form { public Form1() { InitializeComponent(); button1_Click(null, null); } private void button1_Click(object sender, EventArgs e) { HashSet<string> idcards = genIdcards(textBoxAddress.Text, textBoxBirthday.Text, radioButtonMan.Checked); listViewIdcard.Items.Clear(); foreach (var x in idcards) { listViewIdcard.Items.Add(new ListViewItem(x)); } listViewIdcard.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); Clipboard.SetText(idcards.Take(1).ToArray()[0]); } /// <summary> /// 生成IDCARD号码C#版,用于业务测试,请勿用于非法用途 /// By motozilog /// 2019-01-02 /// </summary> /// <param name="address">地址码:全国行政区划数字代码【GB/T2260】</param> /// <param name="birthday">出生日期:GBT 7408-2005数据和交换格式 信息交换 日期和时间表示法(即yyyyMMdd)</param> /// <param name="man">是否为男性</param> /// <seealso cref="https://mp.weixin.qq.com/s/YEBmaV3d7zF_fJZ3ESq8xw" 56行Python代码实现身份证字典生成器/> /// <returns></returns> private HashSet<string> genIdcards(string address,string birthday,bool man) { int[] ratios = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };//1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ; int[] remains = new int[] { 1, 0, 11, 9, 8, 7, 6, 5, 4, 3, 2 }; HashSet<string> idcards = new HashSet<string>(); //通过穷举获取 for (int id = 1; id <= 999; id++) { string idcard = address + birthday + id.ToString("000"); int sum = 0; //1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ; for (int i = 0; i < idcard.Length; i++) { int bit = Convert.ToInt32(idcard.Substring(i, 1)) * ratios[i]; //2、将这17位数字和系数相乘的结果相加; sum = sum + bit; } //3、用加出来和除以11,看余数是多少;余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2; int remain = remains[sum % 11]; if (man == true && (remain % 2 == 1)) { //男性为偶数 idcard = idcard + ((remain == 11) ? "X" : remain.ToString("0")); //如果为11则转换成X idcards.Add(idcard); } else if (man == false && (remain % 2 == 0)) { //女性为偶数 idcard = idcard + ((remain == 11) ? "X" : remain.ToString("0")); //如果为11则转换成X idcards.Add(idcard); } } return idcards; } private void listViewIdcard_Click(object sender, EventArgs e) { if (listViewIdcard.SelectedItems.Count > 0) { Clipboard.SetText(listViewIdcard.SelectedItems[0].Text); labelCopy.Text = "己复制:" + listViewIdcard.SelectedItems[0].Text; } } } }
搞定!
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)