人民币数字大写转换 java实现 [附源码]

动机

业务系统开发的报表中经常需要将人民币数值转换为大写,所以江苏南大先腾java研发框架中写了一个通用的大写转换函数。由于报表的数值一般比较大所以在java开发中不建议使用float或者int类型,请用BigDecimal类型,为了更加方便调用函数的参数使用字符串类型。

源码

    final static private String CNum[]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
    final static private String CNum2[]={"〇","一","二","三","四","五","六","七","八","九"};
    final static private String CBit[]={"","拾","佰","仟"};
          //拾佰仟万拾佰仟亿拾佰仟萬
    /*
     * 将数值大写
     */
    public static String capitalization(String szNum)
    {
        StringBuilder resstr = new StringBuilder();
        String tmpstr = szNum.trim();
        int sl = tmpstr.length();
        int sp=0;
        int dotpos = tmpstr.indexOf('.');
        if(dotpos != -1){
            while(sl>1 && tmpstr.charAt(sl-1) == '0') sl--;
            if(tmpstr.charAt(sl-1)=='.') sl--;
            if(sl != tmpstr.length()){
                tmpstr = tmpstr.substring(0,sl);
            }
        }else dotpos = sl;
        if(sl<1) return CNum[0];
        if(tmpstr.charAt(0) == '-'){
            resstr.append("负");
            sp = 1;
        }
        String integerNum = tmpstr.substring(sp,dotpos-sp);
        String decimalNum ="";
        if(dotpos+1<sl) decimalNum = tmpstr.substring(dotpos+1);
        sl = integerNum.length();
        sp=0; while(sp<sl && integerNum.charAt(sp)=='0') sp++;
        if(sp > 0) integerNum = integerNum.substring(sp);
        int inl = integerNum.length();
        if(inl>0){
            int h = (inl-1) % 4 ;
            int j = (inl-1) / 4 + 1;
            sp=0;
            boolean allzero = false;
            boolean preallzero = false;
            for(;j>0;j--){
                int k=h;
                h = 3;
                boolean preiszero = allzero;
                allzero = true;
                for(;k>=0;k--,sp++){
                    if(integerNum.charAt(sp) == '0')
                        preiszero = true;
                    else{
                        allzero = false;
                        if(preiszero)
                            resstr.append("零");
                        preiszero = false;
                        resstr.append(CNum[(byte) (integerNum.charAt(sp)) - 48]).append(CBit[k]);
                    }
                }// end for k
                if(/*j!=0 &&*/ j % 2 == 0 ){
                    if(!allzero)
                        resstr.append("万");
                }
                else
                {
                    if(!allzero || !preallzero){
                        int repyi = j/2;
                        for(int i=0; i<repyi; i++)
                            resstr.append("亿");
                    }
                }
                preallzero = allzero;
            }//end for j
        }else
            resstr.append("零");

        int dnl = decimalNum.length();
        if(dnl>0){
            resstr.append("点");
            for(int i=0; i<dnl; i++){
                resstr.append(CNum[(byte)(decimalNum.charAt(i))-48]);
            }
        }
        return resstr.toString();
    }
    /*
     * 仅仅是把 0~9 转换为 "〇","一","二","三","四","五","六","七","八","九"
     */
    public static String uppercaseCN(String szNum)
    {
        StringBuilder resstr = new StringBuilder();
        String tmpstr = szNum.trim();
        int sl = tmpstr.length();
        int sp=0;

        if(sl<1) return CNum2[0];
        for(;sp<sl;sp++)
            if(tmpstr.charAt(sp)>='0' && tmpstr.charAt(sp)<='9')
                resstr.append(CNum2[tmpstr.charAt(sp)-'0']);
            else
                resstr.append(tmpstr.charAt(sp));
        return resstr.toString();
    }


    public static String capitalization(String szNum,final boolean isSimple)
    {
        if (isSimple){
            return uppercaseCN(szNum);
        }
        return capitalization(szNum);
    }

完整代码参见NumberBaseOpt 更多先腾框架项目参见先腾开源计划

测试程序

public static String rmbDX(String f){
        return NumberBaseOpt.capitalization(
                        (f.indexOf('.')>=0? f.substring(0,f.indexOf('.')):f)) + "元"
        + NumberBaseOpt.capitalization(
                String.valueOf(NumberBaseOpt.getNumByte(f,-1)))+"角"
        + NumberBaseOpt.capitalization(
                String.valueOf(NumberBaseOpt.getNumByte(f,-2)))+"分";
    }

    public static void main(String[] args) {
        System.out.println(rmbDX("123.45"));
        System.out.println(rmbDX("3456700000000089123.45"));
    }

运行结果:

壹佰贰拾叁元肆角伍分
叁佰肆拾伍亿亿陆仟柒佰万亿零捌万玖仟壹佰贰拾叁元肆角伍分

猜你喜欢

转载自blog.csdn.net/code_fan/article/details/81458381