我国的身份证编制是有标准的,每一位都不是随便瞎写的,就像我国的地图坐标经纬度一样,并不是真是的经纬度,而是人为加入了偏转,被称为:火星坐标系,但是工作中发现很多人并不了解,在工作中,用户输入的身份证号是否正确,我们根据这个规则是可以做初步校验的,当然真是的校验肯定是要通过公安部授权的接口,这是收费的。但是初步校验是真简单的,我个人发现有些系统并没有加入,所以今天写一篇小文章,做一个常用的工具类来校验身份证号,至于具体的规则,大家可以搜一下这个国标:GB11643-1999,代码如下:

package cn.bridgeli.demo;

import org.apache.commons.lang3.StringUtils;
import org.junit.Assert;
import org.junit.Test;

/**
 * @author Bridge Li
 * @date 2022/1/23 15:01
 */
public class IdNoUtil {

  @Test
  public void testId() {
    String IdNo = "";
    boolean b = validateIdNo(IdNo);
    Assert.assertTrue(b);
  }

  public static boolean validateIdNo(String IdNo) {
    if (StringUtils.isBlank(IdNo) || IdNo.length() != 18) {
      return false;
    }
    char[] charArray = IdNo.toCharArray();
    //前十七位加权因子
    int[] idCardWi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
    //这是除以11后,可能产生的11位余数对应的验证码
    String[] idCardY = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
    int sum = 0;
    for (int i = 0; i < 17; i++) {
      int current = Integer.parseInt(String.valueOf(charArray[i]));
      int count = current * idCardWi[i];
      sum += count;
    }
    char idCardLast = charArray[17];
    int idCardMod = sum % 11;
    if (idCardY[idCardMod].equalsIgnoreCase(String.valueOf(idCardLast))) {
      return true;
    } else {
      return false;
    }
  }
}