Java生成18位身份证号-----终于功成
上一篇 / 下一篇 2009-04-30 00:03:41 / 个人分类:JAVA学习&编程相关
package com.icss.oa.work;
public class IDCard {
// wi =2(n-1)(mod 11)
final int[] wi = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; //
// verify digit
final int[] vi = {1,0,'X',9,8,7,6,5,4,3,2}; //
private int[] ai = new int[18];
public IDCard() {
}
//verify
//get verify
public String getVerify(String eightcardid) { //eightcardid
int remaining = 0;
if (eightcardid.length() == 17) {
int sum = 0;
for (int i = 0; i < 17; i++) {
String k = eightcardid.substring(i, i + 1);
ai[i] = Integer.parseInt(k);
}
for (int i = 0; i < 17; i++) {
sum = sum + wi[i]*ai[i];
}
remaining = sum % 11;
return remaining == 2 ? "X" : String.valueOf(vi[remaining]);
}
else{
return "出错了!";
}
}
//用随机数 写出前17位
public String getSheng(){
// 第一二位 前两位 01- 64
// int number = (int)(Math.random()*(tonum-fromnum))+fromnum;
int number ;
String str=null;
number = (int)(Math.random()*(64-1)+1);
if(number<10)
{
//转换成字符串
str = Integer.toString(number);
str = "0"+number;
//System.out.println(str);
return str;
}
else{
//System.out.println(Integer.toString(number));
return Integer.toString(number);
}
}
public String getShi(){
//第三四位 两位 01-02
int number ;
number = (int)(Math.random()*1+1);
String str=null;
if(number<10)
{
//转换成字符串
str = Integer.toString(number);
str = "0"+number;
//System.out.println(str);
return str;
}
else{
//System.out.println(Integer.toString(number));
return Integer.toString(number);
}
}
public String getXian(){
//第五六位 两位 01-05
int number ;
number = (int)(Math.random()*4+1);
String str=null;
if(number<10)
{
//转换成字符串
str = Integer.toString(number);
str = "0"+number;
//System.out.println(str);
return str;
}
else{
//System.out.println(Integer.toString(number));
return Integer.toString(number);
}
}
public String getYear(){
//第 7--10位 年份:1970-1990
int number;
number = (int)(Math.random()*(1990-1970)+1970);
String str=null;
if(number<10)
{
//转换成字符串
str = Integer.toString(number);
str = "0"+number;
//System.out.println(str);
return str;
}
else{
//System.out.println(Integer.toString(number));
return Integer.toString(number);
}
}
public String getMonth(){
//第11 12 位 月份:01-12
int number ;
number = (int)(Math.random()*(12-1)+1);
String str=null;
if(number<10)
{
//转换成字符串
str = Integer.toString(number);
str = "0"+number;
//System.out.println(str);
return str;
}
else{
//System.out.println(Integer.toString(number));
return Integer.toString(number);
}
}
public String getDay(){
//第13 14 位 日期:01-28
int number ;
number = (int)(Math.random()*(28-1)+1);
String str=null;
if(number<10)
{
//转换成字符串
str = Integer.toString(number);
str = "0"+number;
//System.out.println(str);
return str;
}
else{
//System.out.println(Integer.toString(number));
return Integer.toString(number);
}
}
public String getSequence(){
//第15 16 位 两位:01-99
int number ;
number = (int)(Math.random()*(99-1)+1);
String str=null;
if(number<10)
{
//转换成字符串
str = Integer.toString(number);
str = "0"+number;
//System.out.println(str);
return str;
}
else{
//System.out.println(Integer.toString(number));
return Integer.toString(number);
}
}
public String getSex(){
// 第17 位 一位性别:0-9
int number ;
number = (int)(Math.random()*(9-0)+0);
return Integer.toString(number);
}
public String get17ID(){
String str=null;
str = this.getSheng()+this.getShi()+this.getXian()+ this.getYear()+ this.getMonth()+ this.getDay() + this.getSequence() + this.getSex() ;
return str;
}
public String getIDCard(){
String str=null;
str = this.get17ID() ;
str = str + this.getVerify(str);
//String test = this.get17ID();
//System.out.println("身份证号前17位:"+test);
//System.out.println("身份证号:"+test+this.getVerify(test));
return str;
}
public static void main(String[] args){
IDCard card=new IDCard();
//String idcard="41011119820316258";// 41112119821028551 41102219841112602 410111452105122564
//String idcard = card.get17ID();
//System.out.println("41124919810612243"+card.getVerify(idcard));
//System.out.println("身份证的最后一位为:"+card.getVerify(idcard));
//System.out.println("身份证的最后一位为:"+card.getVerify("你的身份证号前17位"));
//System.out.println("身份证号前17位为:"+card.get17ID());
System.out.println("身份证号为:"+card.getIDCard());
}
}
/*
*下面是 身份证号码的规则:
身份证号码共18位.
前6位是地址码. 省
7--14位是出生年月日
后面4位是生成的代码,
第17位用来做性别判定:偶数 -- 女 ; 奇数--- 男 .
前17位的构成: 2(省)+2(市)+2(县)+4(年)+2(月)+2(日)+2(序号)+1(性别)
第十八位数字的计算方法为:
1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
2.将这17位数字和系数相乘的结果相加。
3.用加出来和除以11,看余数是多少?
4余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2。
5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。
*/
----------------------------------------------------------------------------------------
关于根据前17位计算第十八位的算法,那个是转的,自己又仿照练习了一遍
package com.icss.oa.work;
public class GetVerfycode {
/**
* @param args
*/
/*
*第十八位数字的计算方法为:
1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
2.将这17位数字和系数相乘的结果相加。
3.用加出来和除以11,看余数是多少?
4余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2。
5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。
*/
//定义一个无参构造方法
public GetVerfycode(){
}
//准备基本数据
final int[] coef = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
final int[] mapping = {1,0,'X',9,8,7,6,5,4,3,2};
private int[] store = new int[18];
public String getCode(String number){
String str = null;
if(number.length()== 17){
//取出17位的每一个值
for(int i= 0;i< number.length() ;i++){
String s = number.substring(i,i+1);
store[i]= Integer.parseInt(s);
}
//乘以不同的系数,将这17位数字和系数相乘的结果相加
int sum = 0 ;
for(int i=0;i<17;i++){
sum = sum +store[i]*coef[i];
}
//用加出来和除以11,看余数是多少?
int remaining = sum % 11;
//remaining = 2:'X'?
if(remaining == 2){
str = "X";
}
else{
str = Integer.toString(mapping[remaining]);
}
}
else{
System.out.println("位数不对,出错!");
}
return str;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
GetVerfycode code = new GetVerfycode();
System.out.println("身份证的最后一位为:"+code.getCode("17位身份证号"));
}
}
-------------------------------------------------------------------------------------
后续,批量生成,将生成的数据,写入Excel表或者文本文件中
//向文本中写入100个随机的身份证号,加入main方法中即可
//import java.io.*;
for(int n =1;n<100;n++){
try{
File f = new File("f:\\idcard.txt");
if(f.exists()){
//f.delete();
}
else{
f.createNewFile();
}
FileWriter fw = new FileWriter(f,true);
fw.write(card.getIDCard());
fw.write('\n');
fw.flush();
fw.close();
}catch(Exception e){
System.out.println(e.getStackTrace());
}
}
大功告成,呵呵
虽然对于java高手来说小菜一碟,但对于我来说还是值得高兴的
======================================================
关于地区码:可以采用已知的地区码常量来生成,利用数组随机取值
// 得到六位的地区码
public String getAreacode(){
String[] area = {"110100","110101","110102","110103"};
return area[(int)(Math.random()*(3519))] ;
}
身份证号码验证网站:http://qq.ip138.com/idsearch/index.asp
TAG:
标题搜索
日历
|
|||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
1 | 2 | 3 | 4 | ||||||
5 | 6 | 7 | 8 | 9 | 10 | 11 | |||
12 | 13 | 14 | 15 | 16 | 17 | 18 | |||
19 | 20 | 21 | 22 | 23 | 24 | 25 | |||
26 | 27 | 28 | 29 | 30 | 31 |
我的存档
数据统计
- 访问量: 716545
- 日志数: 415
- 图片数: 1
- 文件数: 3
- 建立时间: 2008-12-07
- 更新时间: 2015-07-14