身份证号码的升位和验证

2008-07-17 14:15:30.0     浏览:1681     来源:巧巧读书
关键词:  升位     身份证  

package com.work.util;

import java.io.BufferedReader;

import java.io.InputStreamReader;

/**

* @author cuiwx

* wangmj整理优化。

*

*/

public class IdCard {

// 经过计算得出的指数数组,算法:2的n-1次方求和,除以11取模

// 如:2的0次方除以11取模=1,2的1次方除以11取模=2,2的2次方除以11取模=4

static int[] wi = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};

// 校验位数组

static char[] ai = { '1', '0', 'x', '9', '8', '7', '6', '5', '4', '3', '2' };

public static void main(String args[]) {

// IdCard ic = new IdCard();

// System.currentTimeMillis();

try {

boolean flag = false;

while (flag) {

BufferedReader reader = new BufferedReader(

new InputStreamReader(System.in));

System.out.println("15位身份证号:");

String lowerid = reader.readLine();

if (lowerid.equals("quit")) {

System.out.println("bye~~");

break;

}

System.out.println("8位出生日期(19791216):");

String birth = reader.readLine();

System.out.println("请输入性别");

String sex = reader.readLine();

System.out.println(checkIdNumber(lowerid, birth, sex));

System.out.println("18位号:" + upperIdNumber(lowerid, birth));

System.out.println(checkIdNumber(upperIdNumber(lowerid, birth),

birth, sex));

}

} catch (Exception e) {

System.out.println(e);

}

}

/**

* 根据15位身份证号和出生日期计算得出18位身份证号

*

* @param lowerId,15位身份证号

* @param birthday出生日期,19810912

* @return upperId,返回18位身份证号

*/

public static String upperIdNumber(String lowerId, String birthday) {

if (lowerId.length() != 15) {

return "请录入15位身份证号码。";

} else {

return lowerId.substring(0, 6) + birthday.substring(0, 2)

+ lowerId.substring(6) + ai[checkBit(lowerId, birthday)];

}

// return lowerId+ai[checkBit("372832198109126616")];

}

/**

* 根据15位身份证号和出生日期,计算校验位

*

* @param lowerId,15位身份证号

* @param birthday出生日期,19810912

* @return mod,第18位校验位,用于从ai数组取数作为身份证号的最后一位,即ai[mod]

*/

public static int checkBit(String lowerId, String birthday) {

if (lowerId.length() != 15)// 请录入15位身份证号码

return -1;

lowerId = lowerId.substring(0, 6) + birthday.substring(0, 2)

+ lowerId.substring(6);

int sum = 0;

// 计算校验位,前 17位加权求和,然后除以11取模

for (int i = 1; i < lowerId.length() + 1; i++) {

sum = sum + wi[i - 1]

* (Integer.parseInt(lowerId.substring(i - 1, i)));

}

// System.out.println("sum = " + sum);

// 计算校验位end

int mod = sum % 11;

return mod;

}

/**

* 根据传入的18位身份证号,计算校验位

*

* @param id,18位身份证号

* @return mod,返回校验位,用于从ai数组取数作为身份证号的最后一位,即ai[mod]

*/

public static int checkBit(String id) {

String lowerId = id.substring(0, 17);

int sum = 0;

for (int i = 1; i < lowerId.length() + 1; i++) {

sum = sum + wi[i - 1]

* (Integer.parseInt(lowerId.substring(i - 1, i)));

}

int mod = sum % 11;

[第1页]   [第2页]   [第3页]   [第4页]   [下一页]