您的位置:首页 > 产品设计 > UI/UE

【课堂程序整理】提取身份证号中的信息(包括地址)

2015-06-06 16:33 495 查看
作业要求:使用GUI界面,输入18位身份证号,判断并输出其中包含的信息。

其中使用到了IO流。自定义异常,GUI界面设计等知识

完整代码:

package chap05;
import java.awt.FlowLayout;

import javax.swing.*;

import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import java.awt.event.*;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Calendar;

class MyException extends Exception{
private int idnumber;
//覆盖原有的Exception方法
public MyException(String message,int id){
super(message);
this.idnumber=id;
}
public int getId(){
return idnumber;
}
@Override
public String toString() {
return this.getMessage();
}
}

public class ID extends JFrame implements ActionListener{
public void regist(String num) throws MyException{
boolean b=false;
for(int i=0;i<num.length();i++){
if(num.charAt(i)<48||num.charAt(i)>57){
b=true;
}
}
if(num.length()!=18){
throw new MyException("异常:请输入身份证的前18位:", 3);
}
if(b){
throw new MyException("异常:身份证号为数字:", 4);
}
}
private JLabel jl_id;
private JTextField jtf_name;
private JTextArea jta_info;
private JButton jb_ok;
private JButton jb_exit;
public ID(){
super("身份证号信息提取");
init();
}
public void init(){
setLayout(new FlowLayout()); //设置为Flow布局管理器
//实例化组件
jl_id=new JLabel("身份证号:");
jtf_name=new JTextField(20);
jb_ok=new JButton("提取:");
jb_exit=new JButton("退出");
jta_info=new JTextArea("身份证号信息为……",5,50);
//将组件加入父容器
this.add(jl_id);
this.add(jtf_name);
this.add(jb_ok);
this.add(jb_exit);
this.add(jta_info);
//将时间源(命令按钮产生单击时间)和监听器(实现了ActionListener接口的类的对象)关联
jb_ok.addActionListener(this);
jb_exit.addActionListener(this);
//使窗口关闭生效
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(600, 170);
setLocationRelativeTo(null);
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent a) {
//131127199410094377
Calendar cal=Calendar.getInstance();
int nowYear=cal.get(Calendar.YEAR);
if(a.getSource().equals(jb_ok)){
try{
String ID =new String(jtf_name.getText().trim());
regist(ID);
String birthYear=ID.substring(6, 10);
String birthMonth=ID.substring(10, 12);
String birthDay=ID.substring(12, 14);
int sexf=ID.charAt(16)-48;
String sex=sexf%2==0?"女":"男";
int age=nowYear-Integer.parseInt(birthYear);
String add=ID.substring(0, 6); //截取身份证号中的前六位
Double add2=Double.parseDouble(add); //将截取的add转换为Double类型
String address=null;
//建立文件IO流,身份证号对应的地址文件存放在"src\\chap05\\ID.xls"中
FileInputStream fis=new FileInputStream("src\\chap05\\ID.xls");
//使用POI.jar中的方法读写Excel文件
HSSFWorkbook wb=new HSSFWorkbook(fis);
HSSFSheet sheet=wb.getSheetAt(0);
for(int i=0;i<sheet.getLastRowNum();i++){
HSSFRow row=sheet.getRow(i);
Double value=row.getCell(0).getNumericCellValue(); /*value为取得的ID.xls中的号码列,不知道为啥单元格格式是文本类型,但是用getStringCellValue()方法不能获取,说格式错误,改为getNumericCellValue()就行了,这里有点不理解。请大神指正*/
String value=row.getCell(0).getStringCellValue(); //这样就不行,报错。
if(add2.equals(value)){
address=row.getCell(1).getStringCellValue();
}
}
jta_info.setText("出生日期:"+birthYear+"年"+birthMonth+"月"+birthDay+"日"+
"\n"+"年龄:"+age+"\n"+"性别:"+sex+"\n"+"地址:"+address);
}catch(MyException e){
if(e.getId()==3){
JOptionPane.showMessageDialog(this,e.toString()+e.getId());
}
if(e.getId()==4){
JOptionPane.showMessageDialog(this,e.toString()+e.getId());
}
} catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
if(a.getSource().equals(jb_exit)){
int j=JOptionPane.showConfirmDialog(this,"确认退出?");
if(j==0){
System.exit(0);
}
}

}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable(){
public void run(){
new ID().setVisible(true);
}
});
}
}


其中在判断地址的代码中,包含地址信息的Excel文件中号码和地址是一一对应的关系,所有的单元格格式都为文本类型,使用getStringCellValue()方法获取单元格内容的时候能获取到地址,但是不能获取数字。总是提示不能使用从text的单元格中获取Numeric类型的值。不知道是怎么回事,还请大神指导。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java ID 身份证信息 IO GUI