1 //********************************************************************************* 2 //将15位身份证转换成18位时,首先把出生年扩展4位,就是在原来15位号码的第6为数字后 3 //增加一个19,然后在第17位数字后添加一位校验码,校验码是由前17位数字本体码加权求 4 //和公式,通过计算模,再通过模得到对应的校验码。 5 //计算校验码公式 6 //(1)17位数字本体码加权求和公式 7 //S=Sum(Ai*Wi),i=0,...,16,先对前17位数字的权求和 8 //Ai:表示第i位置上的身份证号码数字值 9 //Wi:表示第i位置上的加权因子 10 //Wi;7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 11 // 12 //(2)计算模 13 //Y=mod(S,11) 14 //(3)通过模得到对应的校验码 15 //Y:0 1 2 3 4 5 6 7 8 9 10 16 //校验码:1 0 X 9 8 7 6 5 4 3 2 17 //***************************************************************************** 18 /// <summary> 19 /// 将15位的身份证号码转换成18位的身份证好码 20 /// </summary> 21 /// <param name="idCard">身份证号码</param> 22 /// <returns>返回18位身份证号码</returns> 23 public static string Convert15to18 (string idCard) 24 { 25 string code = idCard.Trim();//获得身份证号码 26 if (code.Length==15)//如果是15位则转换 27 { 28 char[] strJY ={ '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' }; 29 int[] intJQ ={ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 }; 30 string strTemp; 31 int intTemp = 0; 32 strTemp = code.Substring(0, 6) + "19" + code.Substring(6); 33 for (int i = 0; i <= strTemp.Length - 1; i++) 34 { 35 intTemp = intTemp + int.Parse(strTemp.Substring(i, 1)) * intJQ[i]; 36 } 37 intTemp = intTemp % 11; 38 return strTemp + strJY[intTemp]; 39 } 40 else 41 { 42 if (code.Length == 18)//如果是18位直接返回 43 { 44 return code; 45 } 46 return string.Empty;//如果即不是15位也不是18位则返回空 47 } 48 } 49 /// <summary> 50 /// 获得出身年月日 51 /// </summary> 52 /// <param name="idCard">身份证号码</param> 53 /// <returns>返回出身年月日</returns> 54 public static string GetBirth(string idCard) 55 { 56 string code = Convert15to18(idCard);//获得身份证号码 57 if (code != string.Empty) 58 { 59 string year = code.Substring(6, 4);//获得身份证号码里面的年 60 string month = code.Substring(10, 2);//获得身份证号码里面的月 61 string day = code.Substring(12, 2);//获得身份证号码里面的日 62 return year + "年" + month + "月" + day + "日"; 63 } 64 else 65 { 66 return string.Empty; 67 } 68 }