必威体育Betway必威体育官网
当前位置:首页 > IT技术

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

时间:2019-08-19 06:14:15来源:IT技术作者:seo实验室小编阅读:51次「手机版」
 

人民币大写金额

动机

业务系统开发的报表中经常需要将人民币数值转换为大写,所以江苏南大先腾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"));
    }

运行结果:

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

相关阅读

第三讲:再例 编程实现英尺到米的转换

/* *Copyright(C)2018,CSDN学院 *All rights reserved *文件名称:main.c *作者:黑可可 *完成日期:2018.4.6 *版本号:V1.0 *问题

如何将NEF格式文件转换为JPG格式

1. NIKON自带的Picture Project来转换。 2. 用google的picasa可以非常简单的处理。 3. Adobe Photoshop CS的最新插件Ado

电容单位F法拉、mF毫法、纳法nF、皮法pF之间是如何转

1法拉(F)= 1000毫法(mF)=1000000微法(μF) 1微法(μF)= 1000纳法(nF)= 1000000皮法(pF) 电容(Capacitance)亦称作“电容量”,是指在给定电位差下

26个英文字母(大小写)+10个数字

大写:ABCDEFGHIJKLMNOPQRSTUVWXYZ 小写:abcdefghijklmnopqrstuvwxyz 数字:0123456789

3种人民币RMB符号的写法

传统的人民币符号写法有两种:¥和&#65509; 现在淘宝有中新的写法: font-family:Arial; +  & yen ; 看三种效果: ¥100元 ¥100元 ¥ 100

分享到:

栏目导航

推荐阅读

热门阅读