用JAVA实现--15位身份证扩展为18位身份证

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用JAVA实现--15位身份证扩展为18位身份证相关的知识,希望对你有一定的参考价值。

15位身份证首先扩展为18位身份证。
号码的结构:公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
地址码(前六位数):表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
出生日期码(第七位至十四位):表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
顺序码(第十五位至十七位):表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
校验码(第十八位数)
(1)十七位数字本体码加权求和公式
S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和
Ai:表示第i位置上的身份证号码数字值
Wi:表示第i位置上的加权因子
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
(2)计算模
Y = mod(S, 11)
(3)通过模得到对应的校验码
Y: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2

谢谢大神们帮忙解答一下!!!跪求啊!!
给个全代码吧各位大神们!!再跪求啊

参考技术A   private static String IdCard15To18(String IdCard15)
  
    int W[] = new int[] 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2;
    char A[] = new char[] '1', '0', 'x', '9', '8', '7', '6', '5', '4', '3', '2';
    if (IdCard15.length() != 15)
      return "";   
    String NewId = IdCard15.substring(0, 6) + "19" + IdCard15.substring(6, 15);
    int K = 0;
    try 
      for (int i = 0; i < NewId.length(); i++) 
        int j = Integer.parseInt(NewId.substring(i,i+1)) * W[i];
        K += j;
       
     catch(Exception e)
     return "";   
   
   return NewId + A[K % 11];

参考技术B 说个思路吧,如果有问题你再贴代码
首先假定身份证类型是字符串,
String pin = "210100,901010,200"(逗号,可以拿掉,只是方便阅读);
结果假定是"210100,19901010,200,3"

String f16=pin.substring(0,5); 地址码,这个应该不变
String f7B=pin.substring(6,11);
String fC=pin.substring(12); 顺序码,这个应该不变
char year = f7B.charAt(0);

if(Interger.valueOf(f7B.subString(0,1) <2)
f7B = "20"+f7B;(判断是否2000后出生的,然后扩展年份为4位.
else
f7B= "19"+f7B
String f18 = "3"; 校验码,这个你自己提供算法吧
Ai:表示第i位置上的身份证号码数字值

去字符串第i个位置上的值,可以用pin.charAt(i);结果是char类型 .

StringBuilder sBuilder = new StringBuilder();
组成新的算法.

sBuilder.append(f16).append(f7B).append(fC).append(f18).
System.out.println(sBuilder.toString());追问

看不太懂…能给个代码么大神…

追答

假定15位身份证是 "210100901010200" 18位身份证结果是"210100199010102003"
其中前6位是不变的,只有出生的年由2位变成4位,末尾添加一个校验码. 所以首先把身份证拆开,只修改变动的部分,然后在拼接. 如果这个逻辑有问题,你需要提出来
private static String updateIdCard15To18(String IdCard15)
, String f16=pin.substring(0,5);
String f7B=pin.substring(6,11);
String fC=pin.substring(12);

char year = f7B.charAt(0);

if(Interger.valueOf(f7B.subString(0,1) <2)
f7B = "20"+f7B;
else
f7B= "19"+f7B
String f18 = IdCard15To19(idCard15);
StringBuilder sBuilder = new StringBuilder();
return sBuilder.append(f16).append(f7B).append(fC).append(f18).toString();


下面的算法是你提供的用来算最后一位的方法吗?我直接调用了,不对就贴代码吧

本回答被提问者和网友采纳
参考技术C 这个不懂!

身份证的测试用例

原文:https://blog.csdn.net/wang_shiwei/article/details/53609195

身份证号:六位数字地址码+八位数字出生日期码+三位数字 顺序码+一位数字校验码

  • 地址码:表示编码对象常住户口所在县(市、镇、区)的行政区划代码
  • 出生日期码:八位年月日格式。前4位表示一个正确的年份(如1900~2015年,不能超过当前年份);中间2位表示01~12月,最后2位表示01~31日;日期还要遵循大月小月、闰年平年的规则。
  • 顺序码:000~999的纯数字。其中最后一位奇数分给男性,偶数分给女性。
  • 数字校验码:0~9数字或X

 

测试用例:

1、地址码:

(1)有效等价类:

  • 参考具体行政区划得出6位数字,如330183

(2)无效等价类:

  • 不是行政区得出的6 位数字

 

2、出生日期码:

(1)有效等价类:

  • 随机抽取几个正确的日期
  • 平年、大月(1、3、5、7、8、10、12)测30号和31号
  • 平年、小月(4、6、9、11)测30号
  • 平年、2月测28号
  • 闰年、2月测29号
  • 较早年份,如1900年,可以根据需求而定
  • 较近年份,如20151221,根据需求而定
  • 01月、12月、01号、31号的有效日期

(2)无效等价类:

  • 平年、大月测32号
  • 平年、小月测31号
  • 平年、2月测29号、30、31号
  • 闰年、2月测30号、31号
  • 00月、13月及以上、00号、32号及以上
  • 非8位数字
  • 全部为空格

 

3、顺序码:

(1)有效等价类:

  • 000~999的奇数
  • 000~999的偶数

(2)无效等价类:非3位数字(包括空格、空)

 

4、数字校验码:

(1)有效等价类:

  • 按照一定规则计算前17位得出(视需求而定)
  • 0~9
  • X
  • x

(2)无效等价类:

  • 非1位数字(包括空格、空)
  • 非X和x的字母

 

5、其他(整体)无效等价类:

  • 17位数字、19位数字
  • 15位合法的身份证号
  • 14位数字、16位数字
  • 号码中含有特殊字符、中文、字母(除最后一位是X或x)、全角字符、空格
  • 为空
  • 全部为空格

以上是关于用JAVA实现--15位身份证扩展为18位身份证的主要内容,如果未能解决你的问题,请参考以下文章

15身份证号码转18位算法,用java 程序怎样实现即java程序源代码?

使用Java编写Hive的UDF实现身份证号码校验及15位升级18位

使用Java编写Hive的UDF实现身份证号码校验及15位升级18位

用JAVA编写一个对18位身份证的输入验证程序.要求输入的18位数字或最后一位为x时,通过验证,否则不通过.

java身份证号位数校验

Java笔试题之《算法与编程》