kaiyun官方注册
您所在的位置: 首页> 其他> 业界动态> 用java实现大写金额转换及身份证15位转18位代码

用java实现大写金额转换及身份证15位转18位代码

2009-01-06
作者:孙国斌

在用java作项目程序开发过程中,遇到财务制度要求在作社保基金支付时,套打《专用付款款凭证》,金额项除阿拉伯数字外,还要求将人民币(大写)打印出来;另有许多参保人员,居民身份证的位数由15位更换成18位,若此类人员进行新参保登记时,不进行校验检查,将会造成同一参保人员,以不同的居民身份证号在业务系统中进行重复登记。故需提供将15位身份证转换成18位,并检验此值与核心数据库是否有相同值,有则提示此人员已参保。另提供对18位身份证的校验功能(注:按已公布的国标算法)。
模块描述

(1)人民币在大写功能转换,见doubleToChinese模块,实现的方法为将数值及位数分别取出后,按对应的值将其转换成字串即可。如100,则大写金额为“壹百整“;对负金额则加负字,例-100.01,大写金额为“负壹百零壹分整”。

(2)身份证由15位转18位,可见fixPersonIDCode模块。附:提交判断是否为有效的18位身份证号isIdentityId模块,方法为判断年份为19开头的18位身份证号,将其转化为15位后,按国标进行修补,若经转换的值同输入的18位值相同,则说明身份证编号是有效的,否则身份证号可能有误;考虑到2000年以后出生的人的身份证编号,可能到2016年以后才能申请到,到时此系统能否还在使用很难说,故暂未提供对其身份证号码的判断功能。但在此也提供解决的办法,可以先判断18位身份证中的年份,对以20开头的年份,进行转换时修补程序中改为加20既可。
目前以上功能模块在社保核心业务系统应用正常。
本例用jbuilder7编译通过。说明:以下代码中所加注的说明,说明功能模块的作用。在具体应用中借鉴或拷贝此代码到实际程序中即可使用。
package csi.utilitytools;

import java.text.DateFormat;
import java.text.NumberFormat;
import java.util.*;
import java.io.ByteArrayInputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;

public class COMUT {

public COMUT() {
}

/**
* 修补15位居民身份证号码为18位
* @param personIDCode
* @return
*/
public static String fixPersonIDCode(String personIDCode)
{
String retIDCode = "";
if ( personIDCode == null || personIDCode.trim().length() != 15 ) {
return personIDCode;
}
String id17 = personIDCode.substring(0,6) + "19" + personIDCode.substring(6,15); //15为身份证补'19'

char[] code = {'1','0','X','9','8','7','6','5','4','3','2'}; //11个
int[] factor={0, 2,4,8, 5,10,9,7, 3,6,1,2, 4,8,5,10, 9,7}; //18个;
int[] idcd = new int[18];
int i;
int j;
int sum;
int remainder;

for (i=1; i<18; i++)
{
j = 17 - i ;
idcd[i] = Integer.parseInt(id17.substring(j, j+1));
}

sum = 0;
for (i=1; i<18; i++)
{
sum = sum + idcd[i] * factor[i];
}
remainder = sum%11;
String lastCheckBit = String.valueOf(code[ remainder ]);
return id17 + lastCheckBit;
}

/**
*人民币大写金额转换
* @param number
* @param pattern
* @return
* @throws GeneralException
*/
public static String format(double number,String pattern)
{
DecimalFormat df = new DecimalFormat(pattern);
return df.format(number);
}
public static String format(String number,String pattern)
{
double d = new Double(number).doubleValue();
return format(d,pattern);
}
public static String doubleToChinese(double sumofcash)
{
String[] arr = {"分","角","元","拾","百","千","万","拾万","百万",
"千万","亿","拾亿","百亿","千亿"};
String sTmp = "";
String sMoney = "";
String header = "";
if(sumofcash<0)
header = "负";
sumofcash = Math.abs(sumofcash);
double dTmp =sumofcash*100;
sMoney = format(dTmp,"0,000.#");
StringTokenizer st = new StringTokenizer(sMoney,",");
String tmp = "";
while (st.hasMoreElements()){
tmp = tmp + st.nextToken();
}
sMoney = tmp;
int iLen = sMoney.length();
int count = 0;
for (int i=0;i {
String sTemp = sMoney.substring(i,i+1);
if (sTemp.equals("0"))
{
count++;
if (count==1)
{
sTmp = sTmp + trans(sTemp);
}
}else
{
sTmp = sTmp + trans(sTemp);
sTmp = sTmp + arr[iLen-i-1];
count = 0;
}

}
sTmp = sTmp.trim();
iLen = sTmp.length();
if (sTmp.substring(iLen-1,iLen).equals("零"))
{
sTmp = sTmp.substring(0,iLen-1);
}
sTmp = sTmp + "整";
sTmp = header.concat(sTmp);
return sTmp;
}
private static String trans(String args)
{
int iTemp = Integer.parseInt(args);
String sRes = "";
switch (iTemp)
{
case 1:sRes = "壹";
break;
case 2:sRes = "贰";
break;
case 3:sRes = "叁";
break;
case 4:sRes = "肆";
break;
case 5:sRes = "伍";
break;
case 6:sRes = "陆";
break;
case 7:sRes = "柒";
break;
case 8:sRes = "捌";
break;
case 9:sRes = "玖";
break;
case 0:sRes = "零";
}
return sRes;
}


/**
* 判断是否是有效的18位或15位居民身份证号码
* @param identityId:18位或15位居民身份证号码
* @return:true: 有效的18位或15位居民身份证号码
*/
public static boolean isIdentityId(String identityId) {
if(isEmpty(identityId)) return false;
try{
if(identityId.length()==18){
String identityId15 = identityId.substring(0,6)+identityId.substring(8,17);
//System.out.println("the identityId15 is : "+identityId15);
if(fixPersonIDCode(identityId15).equalsIgnoreCase(identityId)) {
return true;
}else {
return false;
}
}else if(identityId.length()==15){
try{
Long.parseLong(identityId);
return true;
}catch(Exception ex){
return false;
}
}else{
return false;
}
}catch(Exception ex){
return false;
}

}

/**
* 判断是否为空串""
*/
public static boolean isEmpty(String sValue) {
if(sValue==null) return true;
return sValue.trim().equals("") ? true : false ;
}

public static void main(String[] args) {

try{
System.out.println(doubleToChinese(12003000.01)); //打印金额大写
System.out.println(fixPersonIDCode("650103760113073"));//身份证15位转18位
System.out.println(isIdentityId ("650103760113073")); //否是为有效的15位身份证号

} catch (Exception e) {
e.printStackTrace();
}
}
}

程序调试结果如下:
D:\JBuilder7\jdk1.3.1\bin\javaw -classpath "D:\ejbwork\xjsb\classes;D:\bea\wlserver6.0\lib\weblogic.jar;C:\bea\wlserver6.1\lib\weblogic_sp.jar;C:\bea\wlserver6.1\lib\weblogic.jar;D:\JBuilder7\jdk1.3.1\demo\jfc\Java2D\Java2Demo.jar;D:\JBuilder7\jdk1.3.1\jre\lib\i18n.jar;D:\JBuilder7\jdk1.3.1\jre\lib\jaws.jar;D:\JBuilder7\jdk1.3.1\jre\lib\rt.jar;D:\JBuilder7\jdk1.3.1\jre\lib\sunrsasign.jar;D:\JBuilder7\jdk1.3.1\lib\dt.jar;D:\JBuilder7\jdk1.3.1\lib\htmlconverter.jar;D:\JBuilder7\jdk1.3.1\lib\tools.jar" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=zw2k:1992,suspend=y
csi.utilitytools. COMUT
壹千万贰百万零叁千零壹分整650103197601130732
true

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306116;邮箱:aet@chinaaet.com。
Baidu
map