这是我在博客园写的第一篇技术博文,很有纪念意义啊,之前一直拖了好久没有写,主要忙着复习考研。以后尽量抽出时间来写博文,保证一周一篇的频率吧
这个程序的想法源于老师布置的一个Java实验,让用户输入一个身份证号码,然后来判断是新身份证(18位)还是老身份证(15位),并把老的身份证号码转换为新的身份证号码;其中还要对身份证的各项信息进行正误提醒(例如出生年月等),最后就是根据身份证的前六位来判断用户的所在地。
下面来把我的思路来说一下:
1.在数据库中新建一个数据库,用于存储地区编码,脚本如下:
create database idinfo; use idinfo; create table location (num int primary key, address varchar(32));
1.把地区的编码整理并存入数据库,地区编码可以到国家统计局网站查询(http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/),在这里我使用的是最新的2013年8月31日的版本。先把地区编码保存成为一个txt文件,并进行格式处理,然后利用Java数据流依次扫描存Mysql数据库。代码贴出来如下:
package JdbcTest; import java.io.*; import java.sql.*; import java.util.Scanner; /** * Created by WangKang on 14-3-15. */ public class ID { public static String dbdriver="com.mysql.jdbc.Driver"; public static String dburl="jdbc:mysql://localhost:3306/idinfo"; public static String dbusr="root"; public static String dbpassword="password"; static Connection connection=null; static PreparedStatement preparedStatement=null; static ResultSet resultSet=null;
//连接数据库,并将所给的参数存入数据库 public static void Insert(int idtemp,String locationtemp){ try{ Class.forName(dbdriver); connection= DriverManager.getConnection(dburl,dbusr,dbpassword); String SqlInsert="insert into location(num,address) values(?,?);"; preparedStatement=connection.prepareStatement(SqlInsert); preparedStatement.setInt(1,idtemp); preparedStatement.setString(2,locationtemp); preparedStatement.executeUpdate(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }finally { try { connection.close(); preparedStatement.close(); }catch (Exception e){ e.printStackTrace(); } } }
public static String getLocation(int temp){ String location=""; int city=temp-temp%100; int province=temp-temp%10000; try { Class.forName(dbdriver); connection=DriverManager.getConnection(dburl,dbusr,dbpassword); String SqlSelect="select address from location where num=? or num=? or num=?;"; preparedStatement=connection.prepareStatement(SqlSelect); preparedStatement.setInt(1,province); preparedStatement.setInt(2,city); preparedStatement.setInt(3,temp); resultSet=preparedStatement.executeQuery(); while (resultSet.next()) location+=resultSet.getString(1); }catch (Exception e){ e.printStackTrace(); }finally { try { connection.close(); preparedStatement.close(); }catch (Exception e){ e.printStackTrace(); } } return location; } public static void main(String[] args) throws IOException { File file=new File("d:/id.txt"); InputStreamReader inputStreamReader=new FileReader(file); Scanner scanner =new Scanner(inputStreamReader); while(scanner.hasNext()){ int num=scanner.nextInt(); String location=scanner.nextLine(); Insert(num,location); } } }
其中我在Intellij IDEA下运行这段代码时,存进去的地址是乱码,但我到cmd下运行时就正常了,这一点我还没搞清怎么回事,大家有明白的,还希望多多指教。
3.接下来就是对输入的身份证进行判断,需要新建一个类IDCheck,代码如下:
package JdbcTest; import javax.swing.*; /** * Created by WangKang on 14-3-16. */ public class IDCheck { private int location,year,month,day,code; private static StringBuffer temp=new StringBuffer(); public boolean check(String str){ boolean bool=true; String err="出生年月有误,请确认后再次输入!"; if (str.length()==15){ year=Integer.parseInt(str.substring(6, 8)); month=Integer.parseInt(str.substring(8, 10)); day=Integer.parseInt(str.substring(10, 12)); } else if (str.length()==18){ year=Integer.parseInt(str.substring(6, 10)); month=Integer.parseInt(str.substring(10, 12)); day=Integer.parseInt(str.substring(12, 14)); } else { JOptionPane.showMessageDialog(null, "您输入的身份证长度有误(15位或18位)", "错误", JOptionPane.ERROR_MESSAGE); bool=false; } if (month==1||month==3||month==5||month==7||month==8||month==10||month==12){ if(day>30) { JOptionPane.showMessageDialog(null,err,"错误",JOptionPane.ERROR_MESSAGE); bool=false; } } else if (month==4||month==6||month==9||month==11){ if (day>29) { JOptionPane.showMessageDialog(null, err, "错误", JOptionPane.ERROR_MESSAGE); bool=false; } } else if(month==2){ if (day>27) { JOptionPane.showMessageDialog(null, err, "错误", JOptionPane.ERROR_MESSAGE); bool=false; } } return bool; } public void getMessage(String str){ if (str.length()==15){ temp.append("身份证类型:旧\n"); location=Integer.parseInt(str.substring(0, 6)); year=Integer.parseInt(str.substring(6, 8)); month=Integer.parseInt(str.substring(8, 10)); day=Integer.parseInt(str.substring(10, 12)); code=Integer.parseInt(str.substring(12)); String address=ID.getLocation(location); temp.append("地址:"+address+"\n"); temp.append("出生年月:").append("19").append(year).append(‘年‘).append(month).append(‘月‘).append(day).append("日\n"); if(code%2==0) temp.append("性别:女\n"); else temp.append("性别:男\n"); } else { temp.append("身份证类型:新\n"); location=Integer.parseInt(str.substring(0, 6)); year=Integer.parseInt(str.substring(6, 10)); month=Integer.parseInt(str.substring(10, 12)); day=Integer.parseInt(str.substring(12, 14)); code=Integer.parseInt(str.substring(14,17)); String address=ID.getLocation(location); temp.append("地址:"+address+"\n"); temp.append("出生年月:").append(year).append(‘年‘).append(month).append(‘月‘).append(day).append("日\n"); if(code%2==0) temp.append("性别:女\n"); else temp.append("性别:男\n"); } } public void convert(String str){ char[] verify={‘1‘,‘0‘,‘x‘,‘9‘,‘8‘,‘7‘,‘6‘,‘5‘,‘4‘,‘3‘,‘2‘}; char[] ch=new char[str.length()]; ch=str.toCharArray(); StringBuffer stringBuffer=new StringBuffer(); int count=0; for(int i=0;i<str.length();i++){ if (i<6) stringBuffer.append(ch[i]); if (i==6) stringBuffer.append("19").append(ch[6]); if (i>6) stringBuffer.append(ch[i]); } ch=stringBuffer.toString().toCharArray(); for(int i=0;i<stringBuffer.toString().length();i++){ count+=ch[16-i]*(Math.pow(2,i-1)%11); } count%=11; stringBuffer.append(verify[count]); StringBuffer IDnumber=new StringBuffer(); IDnumber.append("您的新身份证号:").append(stringBuffer.toString()); JOptionPane.showMessageDialog(null,IDnumber.toString(),"信息",JOptionPane.INFORMATION_MESSAGE); } public static void main(String[] args){ String input= JOptionPane.showInputDialog("请输入您的身份证号"); IDCheck IDCheck=new IDCheck(); if (IDCheck.check(input)) { IDCheck.getMessage(input); JOptionPane.showMessageDialog(null,temp.toString(),"信息",JOptionPane.INFORMATION_MESSAGE); if (input.length()==15) IDCheck.convert(input); } } }
这个代码我觉得写得很冗余,但一时又想不出怎么改,也希望大家提点意见
最后就来看下运行的效果
随便输入了一个身份证号
显示出了相应的信息!