黑马程序员技术交流社区

标题: 怎么样取得身份证号码的前几位!和后几位,把它们分开为几部分! [打印本页]

作者: HM邱刚权    时间: 2013-4-3 09:00
标题: 怎么样取得身份证号码的前几位!和后几位,把它们分开为几部分!
如题! 因为考题有一个关于验证身份证的题目!首先就是获取到身份证号码,
但是怎么吧他分解开?或者是有什么更很好的方法?进行判断?他的年龄!
求大神
作者: 邵震    时间: 2013-4-3 09:06
本帖最后由 邵震 于 2013-4-3 09:31 编辑

先占坑在答题

x=152147198910051010(这个是假身份证 吼吼 我才不写自己的)

int z=100000000000000000(一共是十八位对应身份证位数)
用X表示  那就是int y=x/z*z(同上)

因为int‘是整数类型 所以结果的1.52XXXXXXXX被强转成1  所以得到了首位数字 就是1  建议保存到数组里 不然妹取得一个数字就要定义一个 变量名


每次都用得到的数乘上相应的位数  比如千位的1就乘以1000  万位的5就乘以10000  然后往下减最后就能把所有数值取出来了

后面就是重复运算了

代码一会给你

改一下 int貌似不够大 换成long应该行
作者: 张正强    时间: 2013-4-3 09:15
第二代身份证号码规律:1-2位省、自治区、直辖市代码;3-4位地级市、盟、自治州代码; 5-6位县、县级市、区代码;7-14位出生年月日,比如19670401代表1967年4月1日;15-17位为顺序号,表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性;18位为校验码,将前1-17位号码带入公式计算产生,计算的结果为0-10,10用X表示。
知道这个规律就可以用substring(start,end)来截取身份证号了,其中start表示开始,到end结束之间的字符串,包括start位置的字符但是不包括end位置的字符。
作者: 邓建军    时间: 2013-4-3 09:40
下面是我写的判断身份证号,你可以参考一下
//定义一个变量num,用于接收textBox1.Text
            string num = textBox1.Text;
            //判断textBox1.Text是否为空
            if (num=="")
            {
                MessageBox.Show("身份证号不能为空");
            }
            //判断textBox1.Text的长度是否为18
            else if (num.Length!=18)
            {
                MessageBox.Show("身体证号只能是18位!");
            }
            else
            {
                //得到出生年
                string bornYear = num.Substring(6, 4);
                //得到身份证前17位
                string beforCount = num.Substring(0,17);
                //身份证最后一位
                string lastCount = num[17].ToString();
                int lastNum, byr, age;

                long beforeNum;
                //定义一个bool类型标志
                bool flag=true;
                try
                {
                    //将身份证前17位转为long
                    beforeNum = long.Parse(beforCount);
                }
                catch
                {
                    MessageBox.Show("身份证号的前17位只能是数字");
                    //flag改为false
                    flag=false;
                    return;
                }
                try
                {
                    //判断最后一位是不是X,如果不是转成int
                    if (lastCount!="X")
                    {
                        //将身份证最后一位转为int
                        lastNum = Convert.ToInt32(lastCount);
                    }

                }
                catch
                {
                    if (lastCount!="X")
                    {
                        MessageBox.Show("身份证号的最后一位只能是数字或X");
                        //flag改为false
                        flag = false;
                        return;
                    }
                }
                //得到出生年
                byr = int.Parse(bornYear);
                //得到出生月份
                int month = int.Parse(num.Substring(10, 2));
                //得到出生日
                int day = int.Parse(num.Substring(12,2));
                //判断月份是否在1到12
                if ((month<1 || month>12))
                {
                    MessageBox.Show("身份证号非法!");
                    //return是为了不执行下面代码
                    return;
                }
                //根据月份判断天数
                switch (month)
                {
                    case 2:
                    flag= day > 0 && day < 29;
                    break;
                    case 4:
                    case 6:
                    case 9:
                    case 11:
                    flag = day > 0 && day < 31;
                        break;
                    default:
                        flag = day > 0 && day <= 31;
                        break;
                }
                //判断出生出生年是否是闰年
                if (((byr % 4) == 0 && (byr % 100 != 0)) || (byr % 400 == 0))
                {
                    //如果是闰年2月有29天
                    flag = day > 0 && day <= 29;
                }
                //判断身份证号是否合法
                if (flag != true)
                {
                    MessageBox.Show("身份证号非法!");
                    //return是为了不执行下面代码
                    return;
                }
                if (flag==true)
                {
                    int year = Convert.ToInt32(DateTime.Now.Year);

                    //判断年龄是否在1到100岁之间,假设100岁以上的不用身份证
                    if ((byr<year-100) || (byr>year))
                    {
                        MessageBox.Show("你的身份证号非法。");
                    }



作者: HM何伟    时间: 2013-4-3 10:41
我只说一下我的思路:可使用StirngBuffer
   可以先将获取的身份证号码都转成字符,然后对其截取你想要的角标范围.再将得到的字符转回数值型的,接下       来就可以按照常规方法做了.
作者: 邵震    时间: 2013-4-3 10:48
邓建军 发表于 2013-4-3 09:40
下面是我写的判断身份证号,你可以参考一下
//定义一个变量num,用于接收textBox1.Text
            string  ...

哥们  你能不能附上完整代码 这没头没尾的  看这凌乱啊
作者: DWC_5101    时间: 2013-4-3 13:23
string有如下截取字符串的方法:
Substring(开始位数,字符长度)
利用以上方法,可达到目标(注意开始位数从0开始算),参考代码:
            
string sfz = "123456789012345678";      //如果是数字类型,先ToString成字符串
Console.WriteLine(sfz.Substring(0, 6)); //取出身份证号前6位
Console.WriteLine(sfz.Substring(6, 8)); //取出身份证号第7位到14位(出生年月日)

int birthYear = int.Parse(sfz.Substring(6, 4));//取得出生年份,转成int型
int age = DateTime.Now.Year - birthYear;       //计算年龄
Console.WriteLine("Age = " + age);
作者: 曾玉锋    时间: 2013-4-3 16:03
using System.Text.RegularExepressions;

//身份证号码
            string cardno = "511124199503203715";
            //身份证号码的第7位开始到第11位数为出生年份,用正则表达式去匹配,如果身份证号码无误,则返回一个Match对象
            Match mc=Regex.Match(cardno,@"^\d{6}(\d{4})\d{8}$");
            //取得当前年份
            int now = DateTime.Now.Year;  
            //获得出生年份
            int birth=int.Parse(mc.Groups[1].Value);
            //当前年份-出生年份=年龄
            Console.WriteLine(now-birth);
            Console.ReadKey();
作者: 杞文明    时间: 2013-4-4 01:30
认真看一哈视频 视频就有这个题目!!
作者: 杞文明    时间: 2013-4-4 01:35
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 btnChakan_Click(object sender, EventArgs e)
        {
            string yearString  = "0"; //用来记住年

            //判断15位的身份证
            if (txtShengfenzheng.Text.Trim().Length == 15 )
            {
                yearString = "19" + txtShengfenzheng.Text.Substring(6, 2);              
            }
                                       
                //判断18位的身份证
            else if (txtShengfenzheng.Text.Trim().Length == 18)
            {
                if (!ShenFenPanDuane(txtShengfenzheng.Text))
                {
                    MessageBox.Show("身份证输入有误,请重新输入!");
                    txtShengfenzheng.Focus();
                    return;
                }
                yearString = txtShengfenzheng.Text.Substring(6, 4);
            }

            else
            {
                MessageBox.Show("身份证位数有误!请重新输入哦!");
                txtShengfenzheng.Focus();
                return;
            }


            int shijiancha =DateTime.Now.Year - Convert.ToInt32(yearString) ;
            if (shijiancha < 16)
            {
                MessageBox.Show("你是未成年人,不能观看!","提示!");
                return;
            }
            else if (btnChakan.Text == "查看")               
            {
                if (shijiancha >= 16 && shijiancha < 18)
                {
                    DialogResult re = MessageBox.Show("你是未成年人哦,你确定要观看吗??", "提示!", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
                    if (re == DialogResult.OK)
                    {
                        btnChakan.Text = "关闭";
                        PB1.Visible = true;
                    }
                }
                else
                {
                    btnChakan.Text = "关闭";
                    PB1.Visible = true;
                }
            }
            else if (btnChakan.Text == "关闭")
            {
                btnChakan.Text = "查看";
                PB1.Visible = false;
            }

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            PB1.Visible = false;
            PB1.Image= Image.FromFile("1.jpg");
        }

        private void txtShengfenzheng_KeyPress(object sender, KeyPressEventArgs e)
        {
            if ((e.KeyChar < '0' || e.KeyChar > '9') && (e.KeyChar !='x' || e.KeyChar !='X'))
            {
                e.Handled = true;   //让我无法输入               
            }
            if (e.KeyChar == 8)
            {
                e.Handled = false;
            }
        }


        private bool ShenFenPanDuane(string id)   //判断十八位的身份证是否正确
        {
            int[] xishu = { 7 ,9 ,10, 5 ,8 ,4 ,2 ,1 ,6 ,3 ,7 ,9 ,10, 5 ,8 ,4 ,2};
            string number17 = id.Substring(0, 17);   //身份证的前17位
            string number18 = id.Substring(17);      //身份证的第18位
            string checkwei = "10X98765432";
            int sum = 0;   //统计求和
            for (int i = 0; i < 17; i++)
            {
                sum = sum + Convert.ToInt32(number17[i].ToString()) * xishu[i];
            }

            int mod = sum % 11;
            string result = checkwei[mod].ToString();
            if (number18.Equals(result, StringComparison.OrdinalIgnoreCase))
            {
                return true;
            }
            return false;
        }

        private void txtShengfenzheng_TextChanged(object sender, EventArgs e)
        {
            PB1.Visible = false;      
        }
    }
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2