[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];
}