您当前的位置: 首页 > 

梁云亮

暂无认证

  • 2浏览

    0关注

    1211博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【精品】身份证操作工具类

梁云亮 发布时间:2021-04-29 13:08:52 ,浏览量:2

理论基础

410001910101123 410001 910101 123 41000119910101123X 410001 19910101 123X

15位:6位地址码+6位出生年月日(900101代表1990年1月1日出生)+3位顺序码 18位:6位地址码+8位出生年月日(年、月、日分别用4位、2位(不足两位加0)、2位(不足两位加0)数字表示,之间不用分隔符)+3位顺序码+1位校验码

  • 地区码: 1、 第一、二位表示省(自治区、直辖市、特别行政区)。 2、 第三、四位表示市(地级市、自治州、盟及国家直辖市所属市辖区和县的汇总码)。其中,01-20,51-70表示省直辖市;21-50表示地区(自治州、盟)。 3、 第五、六位表示县(市辖区、县级市、旗)。01-18表示市辖区或地区(自治州、盟)辖县级市;21-80表示县(旗);81-99表示省直辖县级市。
  • 顺序码: 表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
  • 校验码 是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么此人的身份证就变成了19位, 而19位的号码违反了国家标准,并且中国的计算机应用系统也不承认19位的身份证号码。Ⅹ是罗马数字的10,用X来代替10,可以保证公民的身份证符合国家标准。 具体校验的计算方式及步骤如下: 1)对前17位数字本体码加权求和: S = Sum(Ai * Wi), i = 0, … , 16   其中Ai表示第i位置上的身份证号码数字值,Wi表示第i位置上的加权因子,其各位对应的值依次为: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 2)以11对S取模: Y = mod(S, 11) 3)根据模Y 的值得到对应的校验码 Y值 0 1 2 3 4 5 6 7 8 9 10   校验码 1 0 X 9 8 7 6 5 4 3 2 其中X来代替用来罗马数字中的10,即Ⅹ。
代码
public class IdCardUtil {

    /**
     * 将15位转换为18位
     *
     * @param idCard 15位身份证号
     * @return String 18位身份证号
     */
    private static String tran15to18(String idCard) {
        if (idCard == null || "".equals(idCard)) {
            throw new RuntimeException("身份证不能为空");
        }
        if (idCard.length() != 15) {
            throw new RuntimeException("身份证长度不正确");
        }
        idCard = idCard.substring(0, 6) + "19" + idCard.substring(6);//加入年份,变成17位

        //计算校验位   begin
        char[] Ai = idCard.toCharArray();
        int[] Wi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
        char[] verifyCode = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
        int S = 0;
        int Y;
        for (int i = 0; i             
关注
打赏
1665409997
查看更多评论
0.0406s