任务说明:
一、实现模块判断传入的身份证号码的正确性;
实现要求:
一、实现功能模块;
身份证号码结构:17位数字和1位校验码:6位地址码数字,8位生日数字,3位出生时间顺序号,1位校验码。
1,检验位数是否为18位。
2,检验校验位,前17位计算出的余数所对应的字符是否==第18位的字符。
3,校验年月日,分别校验年份,月份,日期是否在正确范围内。
二、针对所实现的模块编写对应的单元测试代码;
package pdID;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import javax.xml.bind.Validator;
public class pdID{
final static int[] A = {‘1‘, ‘0‘, ‘X‘, ‘9‘, ‘8‘, ‘7‘, ‘6‘, ‘5‘, ‘4‘, ‘3‘, ‘2‘};
final static int[] P = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10,
5, 8, 4, 2};
public static boolean isIdcard(String s){
//校验位数是否==18
if(s == null || s.length() != 18))
return false;
final char[] cs = s.toUpperCase().toCharArray();
int power = 0;
for(int i=0; i<cs.length; i++){
if(i==cs.length-1 && cs[i] == ‘X‘)
break;
(cs[i]<‘0‘ || cs[i]>‘9‘)
return false;
< cs.length -1){
power += (cs[i] - ‘0‘) * POWER_LIST[i];
}
}
//1校验前17位计算所得余数是否==校验码
if(cs[cs.length -1 ] == PARITYBIT[power % 11]){
//2校验年份
String year = s.substring(6, 10);
final int iyear = Integer.parseInt(year);
if(iyear < 1900 || iyear > Calendar.getInstance().get(Calendar.YEAR))
return false;//<1900年的错,>今年的错
//3校验月份
String month =s.substring(10,12);
final int imonth = Integer.parseInt(month);
if(imonth <1 || imonth >12){
return false;
}
//4校验日期
String day =s.substring(12, 14);
final int iday = Integer.parseInt(day);
if(iday < 1 || iday > 31)
return false;
}else
return false;
}
public static void main(String[] args) {
for(int i=0;i<10;i++){
final String s = "330482199607070616";
System.out.println(s+" --> "+isIdcard(s));
}
}
}
三、需要按PSP流程进行工作量估算,填写任务清单工作量估算表。
任务清单工作量估算表:
PSP阶段 | 时间估算(小时) | 实际实际(小时) | |
计划 | 估计每个阶段的时间成本 | 0.5 | 0.6 |
开发 | 需求分析 | 0.5 | 0.4 |
系统设计 | 0.6 | 0.6 | |
设计复审 | 0.3 | 0.3 | |
代码实现 | 0.7 | 0.8 | |
代码复审 | 0.3 | 0.3 | |
测试 | 0.4 | 0.3 | |
报告 | 测试报告 | 0.4 | 0.4 |
总结 | 0.2 | 0.2 |