Java 将小写金额转换为大写金额

273 阅读2分钟

1.问题

在日常开发中,想把小写金额转换为大写金额,类似这样:4529.21 ---》肆仟伍佰贰拾玖圆贰角壹分

2.具体实现

(1)实现代码

/**
 * 金额转换(小写转为大写)
 * @param money 金额
 * @return result
 */
public static String amountChange(double money){
    String[] upNum = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
    String[] unit = {"圆","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟"};

    NumberFormat numFormat = NumberFormat.getInstance();
    numFormat.setMaximumFractionDigits(2);//设置小数位个数
    numFormat.setGroupingUsed(false);//取消科学记数法
    String formatNum = numFormat.format(money);
    String str = formatNum + "";//浮点型转为字符型
    String lastUpNum = "null"; //用于存放上个参数的值
    String[] split = str.split("\.");
    String strMoney = split[0];
    String point = "";
    String result = "";//返回的结果

    /*小数部分取值处理*/
    if(split.length>1){
        point = split[1];
        if(point.length()==1){
            point = point.concat("0");
        }
    }else {
        point = "0";
    }
    int moneyLen = strMoney.length();
    if(money==0){
        return "零圆整";
    }
    if(moneyLen>12){
        return "金额:"+money+"元,超出大写转换范围。最大金额:999999999999.99元";//大于12位就直接返回
    }

    /*整数(integer)部分处理*/
    if(!"0".equals(strMoney)){
        for (int i = 0; i < moneyLen; i++) {
            String strNum = strMoney.charAt(i)+"";
            int singleNum = Integer.parseInt(strNum);
            String upSingleNum = upNum[singleNum];
            if(!"零".equals(lastUpNum)){ //上一为不等于0的情况
                if(!"零".equals(upSingleNum)){
                    result = result.concat(upSingleNum).concat(unit[moneyLen-i-1]);
                }else
                    if( (moneyLen-i)==5 || (moneyLen-i)==9 ){  //为零但是在万、亿位上要加单位 (moneyLen-i)==9 指的是单位:亿。  (moneyLen-i)==5指的是单位:万
                        lastUpNum="";
                    }else {
                        result=result.concat(upSingleNum);
                    }
            }
            if("零".equals(lastUpNum) && !"零".equals(upSingleNum)){  //上一位为0的情况
                result = result.concat(upSingleNum).concat(unit[moneyLen-i-1]);
            }
            if((moneyLen-i)==5 || (moneyLen-i)==9 ){   //捕捉上一位数(lastUpNum)为零的情况做优化
                if("零".equals(lastUpNum)||"null".equals(lastUpNum)){  //排除加单位时前面为"零"的情况。如:两百零万
                    result = result.substring(0,result.length()-1);
                }
                if(!result.endsWith("亿")){
                    result = result.concat(unit[moneyLen-i-1]);
                }
                lastUpNum="";
            }else {
                lastUpNum = upSingleNum;//把当前大写数字复制给 lastUpNum 用于下次判断
            }
        }
        result=result.replaceAll("零零","零");//对几万元整和几亿元整(result:五万零或者五亿零零)做优化
        if(result.endsWith("零")){
            String substring = result.substring(0,result.length() - 1);
            result = substring;
        }
        result = result.concat("圆");
        result = result.replaceAll("圆圆","圆");
        result = result.replaceAll("万万","万");
    }

    if("0".equals(point)){  //小数(point)部分处理
        result =  result+"整";
    }else {
        if((point.charAt(0)+"").equals("0")){  //去整
            result = result.concat(upNum[Integer.parseInt(point.charAt(1)+"")]+"分");
        }else if((point.charAt(1)+"").equals("0")){
            result = result.concat(upNum[Integer.parseInt(point.charAt(0)+"")]+"角");
        }else {
            result = result.concat(upNum[Integer.parseInt(point.charAt(0)+"")]+"角").concat(upNum[Integer.parseInt(point.charAt(1)+"")]+"分");
        }
    }
    return result;
}

(2)测试代码

@Test
public void changTest() {
    NumberFormat instance = NumberFormat.getInstance();
    instance.setGroupingUsed(false);
    double lowNum = 4529.21;
    String upNum= amountChange(lowNum);
    System.out.println("小写金额为:"+lowNum+"元");
    System.out.println("大写金额:"+upNum);
}

(3)测试结果

测试结果.png

3.注意事项及备注

(1)本文参考以下文章: blog.csdn.net/CY_99/artic…