当前位置: 代码迷 >> J2SE >> 用Java编撰身份证号码的分析
  详细解决方案

用Java编撰身份证号码的分析

热度:155   发布时间:2016-04-23 19:45:46.0
用Java编写身份证号码的分析
[b][b][b][size=16px][size=12px][size=18px]从键盘输入一个身份证号码,回车之后,判断是否为正确号码(位数,有无字符);如果正确,则判断他是旧号码(15位)还是新号码(18位),如果是旧号码,把它转为新号码,如果是新号码,打印出该人的生日和性别。
旧号码转新号码的规则:
(1) 年份由两位变成四位;
(2) 最后一位为效验码。效验码的公式为:(Σ(ai×wi))%11
  其中:i是从右向左的包括效验码在内的序号(1-18)
ai是第i位上号码的字符值
wi是第i位上的加权因子,其数值依据公式wi=(2(i-1))%11
求出(Σ(ai×wi))%11之后依据下表得到效验码:
(Σ(ai×wi))%11
         
0
         
1
         
2
         
3
         
4
         
5
         
6
         
7
         
8
         
9
         
10

效验码值
         
1
         
0
         
X
         
9
         
8
         
7
         
6
         
5
         
4
         
3
         
2

(3)计算ab:函数为:java.lang.Math.pow(a,b)
       (4)判断是否整数:函数为:java.lang.Integer.parseInt(String str)
------解决思路----------------------

/**
 * 判断输入等操作
 * @param in
 */
private void action(String in) {
int len = in.length();
if (len == 18) {
// 前17位必须都是数字
if (!isNumber(in.substring(0, 16))) {
System.out.println("错误:输入18位,存在非法字符。");
}else {
// 最后一位只能是“X”或者数字
String last = in.substring(17, 18);
if (!last.equals("X") && !isNumber(last)) {
System.out.println("错误:输入18位,存在非法字符。");
} else {
//生成校验码与输入值比较
if (createCode(in).equals(last)) {
print(in);
} else {
System.out.println("错误:输入18位,校验错误。");
}
}
}
} else if (len == 15) {
if (!isNumber(in)) {
System.out.println("错误:输入15位,存在非法字符。");
} else {
// 格式转换
in = in.substring(0, 6) + "19" + in.substring(6);
in += createCode(in);
System.out.println("输入15位,转换为新号码为:" + in);
print(in);
}
} else {
System.out.println("错误:输入不是15位或者18位。");
}
}

/**
 * 按照要求输出
 */
private void print(String in) {
int year = Integer.parseInt(in.substring(6, 10));
int month = Integer.parseInt(in.substring(10, 12));
int day = Integer.parseInt(in.substring(12, 14));
int x = Integer.parseInt(in.substring(16, 17));
String sx;
if (x % 2 == 0) {
sx = "女";
} else {
sx = "男";
}
System.out.println("这个人是:" + sx + "性,出生日期为:" + year + "年" + month + "月"
+ day + "日");
}

/**
 * 判断输入是否全是数字
 * 
 * @param in
 * @return
 */
private boolean isNumber(String in) {
String s;
for (int i = 0; i < in.length(); i++) {
s = in.substring(i, i + 1);
try {
Integer.parseInt(s);
} catch (NumberFormatException e) {
return false;
}
}
return true;
}

/**
 * 计算校验码
 * 
 * @param in
 * @return
 */
private String createCode(String in) {
String[] codes = new String[] { "1", "0", "X", "9", "8", "7", "6", "5",
"4", "3", "2" };
int[] weights = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5,
8, 4, 2 };

int ai, wi, sum = 0;
for (int i = 0; i < 17; i++) {
ai = Integer.parseInt(in.substring(i, i + 1));
// //这个没理解,写成死的了
// wi = (2 *i) % 11;
wi = weights[i];
sum += ai * wi;
}
sum %= 11;
return codes[sum];
}
  相关解决方案