《电子技术应用》
您所在的位置:首页 > 其他 > 业界动态 > 用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-82306118;邮箱:aet@chinaaet.com。