輸入身份證號,出生年月日、性別、判斷其地區
阿新 • • 發佈:2019-01-18
一、首先弄清楚一些東西:
15位的舊身份證,最後一個數是單數的為男,雙數的為女。
18位的新身份證,倒數第二位是單數的為男,雙數的為女。
校驗的計算方式:
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對計算結果取模
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
二、怎麼得到出生地區?
因為身份證前6位代表的是其出生地方,而且都有一一對應的關係,所以直接拿著去比對就可以。
三、程式碼實現
[java] view plaincopyprint?- package j8;
- import java.io.BufferedReader;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
-
import java.util.Properties;
- publicclass IdCardParser {
- publicstaticvoid main(String[] args) {
- try {
- System.out.println("請輸入您要查詢的身份證號碼:");
- InputStreamReader reader = new InputStreamReader(System.in);
- String str = new BufferedReader(reader).readLine();
-
IdCard ic = IdCardParser.parse(str);
- if(ic != null){
- System.out.println(ic);
- }else{
- System.out.println("您輸入的有誤");
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- privatestaticfinalbyte[] factor = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9,
- 10, 5, 8, 4, 2, 1 };
- privatestaticfinalchar[] ch = { '1', '0', 'X', '9', '8', '7', '6', '5',
- '4', '3', '2' };
- /**
- * 15位身份證轉18位身份證.失敗返回null
- *
- * @param $15
- * @return
- */
- privatestatic String $15to18(String $15) {
- if ($15 == null) {
- returnnull;
- }
- if ($15.length() == 18) {
- return $15;
- }
- if ($15.length() != 15) {
- returnnull;
- }
- StringBuilder sb = new StringBuilder($15);
- sb.insert(6, "19");// 加入年兩位
- int result = 0;
- for (int i = 0; i < sb.length(); i++) {
- result += (Integer.parseInt(sb.charAt(i) + "")) * factor[i];
- }
- return sb.append(ch[result % 11]).toString();// 加入效驗碼
- }
- /**
- * 驗證第18位效驗碼
- *
- * @param idCardNumber
- * @return
- */
- privatestaticboolean check18(String idCardNumber) {
- if (idCardNumber == null || idCardNumber.length() != 18) {
- returnfalse;
- }
- int result = 0;
- for (int i = 0; i < idCardNumber.length() - 1; i++) {
- result += (Integer.parseInt(idCardNumber.charAt(i) + ""))
- * factor[i];
- }
- return ch[result % 11] == idCardNumber.charAt(17);
- }
- /**
- * 驗證出生日期是否合法
- *
- * @param idCardNumber
- * @return
- */
- privatestaticboolean checkBirthDay(int year, int month, int day) {
- if (year < 1900 || year > 2013) {
- returnfalse;
- }
- if (month > 12 || month < 1) {
- returnfalse;
- }
- if (day < 1) {
- returnfalse;
- }
- byte[] dayOfMonth = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
- if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
- dayOfMonth[1] = 29;
- }
- return day <= dayOfMonth[month - 1];
- }
- publicstatic IdCard parse(String idCardNumber) {
- // 檢查字串
- if (!idCardNumber.matches("\\d{15}|\\d{18}|\\d{17}(?i)X")) {
- returnnull;
- }
- IdCard ic = new IdCard();
- // 15->18
- idCardNumber = $15to18(idCardNumber);
- // 檢查效驗碼
- if (idCardNumber == null || !check18(idCardNumber)) {
- returnnull;
- }
- // 檢查出生年月
- int year = Integer.parseInt(idCardNumber.substring(6, 10));
- int month = Integer.parseInt(idCardNumber.substring(10, 12));
- int day = Integer.parseInt(idCardNumber.substring(12, 14));
- if (!checkBirthDay(year, month, day)) {
- returnnull;
- }
- ic.setNumber(idCardNumber);
- // 查詢身份證歸屬