java金额大小写转换/金额转大写/数字金额转换为中文大写金额

文章目录


处理金额问题时,经常需要将数字金额转换为中文大写金额,以下为代码及测试用例。

代码

package com.common.utils.money;

import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.text.DecimalFormat;

public class MoneyUtils {
    
    

    private static final String[] cnNums = {
    
     "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; // 汉字的数字
    private static final String[] cnIntRadice = {
    
     "", "拾", "佰", "仟" }; // 基本单位
    private static final String[] cnIntUnits = {
    
     "", "万", "亿", "兆" }; // 对应整数部分扩展单位
    private static final String[] cnDecUnits = {
    
     "角", "分"}; // 对应小数部分单位
    private static final String cnInteger = "整"; // 整数金额时后面跟的字符
    private static final String cnIntLast = "元"; // 整型完以后的单位

    /**
     * 金额大小写转换,将数字转换为汉字
     * @param money 支持最大16位整数2位小数
     * @return
     */
    public static String amountConversion(String money){
    
    
        //如果传入为空,则返回null
        if(StringUtils.isBlank(money)){
    
    
            return "null";
        }
        String result = "";
        //整数部分
        String integer="";
        //小数部分
        String point="";
        if(money.matches("^[0-9]{0,16}|[0-9]{0,16}+([.]{0,1}[0-9]{0,2})$")){
    
    
            BigDecimal bigDecimal = new BigDecimal(money);
            //对金额进行格式化,统一小数点后面保留两位。 此举能去除整数部分多余的0,以及小数部分统一保留两位 如:00456.1-->456.10
            money = new DecimalFormat("##0.00").format(bigDecimal);
            //整数部分
            integer = money.split("\\.").length==1?money:money.split("\\.")[0];
            //小数部分
            point = money.split("\\.").length==1?"00":money.split("\\.")[1];


            if("0".equals(integer)){
    
    
                result = "零"+cnIntLast;
            }else{
    
    
                int zeroCount = 0;
                char[] array = integer.toCharArray();
                String n="";
                int p=0,q=0,m=0;
                for (int i = 0; i < integer.length(); i++) {
    
    
                    n = Character.toString(array[i]);
                    p = integer.length() - i - 1;
                    q = p / 4;
                    m = p % 4;
                    if (n.equals("0")) {
    
    
                        zeroCount++;
                    } else {
    
    
                        if (zeroCount > 0) {
    
    
                            result += cnNums[0];
                        }
                        zeroCount = 0; // 归零
                        result += cnNums[Integer.parseInt(n)] + cnIntRadice[m];
                    }
                    if (m == 0 && zeroCount < 4) {
    
    
                        result += cnIntUnits[q];
                    }
                }
                result += cnIntLast;
            }

            //组装小数部分
            if ("00".equals(point)) {
    
    
                result += cnInteger;
            }else{
    
    
                String n="";
                char[] array = point.toCharArray();
                for (int i = 0; i < point.length(); i++) {
    
    
                    n = Character.toString(array[i]);
                    if (!n.equals("0")) {
    
    
                        result += cnNums[Integer.parseInt(n)] + cnDecUnits[i];
                    }
                }
            }


        }else{
    
    
            return "请检查金额(整数位不能超过16位,小数不能超过2位)";
        }

        return result;
    }

    public static void main(String[] args) {
    
    
        System.out.println(amountConversion("107.01"));
        for(int i=0;i<20;i++){
    
    
            int integer = RandomUtils.nextInt(0,17);
            int point = RandomUtils.nextInt(0,3);
            String in = integer==0?"0":RandomStringUtils.randomNumeric(integer);
            String po = point==0?"0":RandomStringUtils.randomNumeric(point);
            String money = in+"."+po;
            System.out.println(money +"====="+amountConversion(money));
        }
    }


}


执行结果

03512484.84=====叁佰伍拾壹万贰仟肆佰捌拾肆元捌角肆分
0997951710432.26=====玖仟玖佰柒拾玖亿伍仟壹佰柒拾壹万零肆佰叁拾贰元贰角陆分
5170473553807.0=====伍兆壹仟柒佰零肆亿柒仟叁佰伍拾伍万叁仟捌佰零柒元
57646.7=====伍万柒仟陆佰肆拾陆元柒角
068874838.95=====陆仟捌佰捌拾柒万肆仟捌佰叁拾捌元玖角伍分
123.0=====壹佰贰拾叁元
1137531.0=====壹佰壹拾叁万柒仟伍佰叁拾壹元
140220033243377.3=====壹佰肆拾兆零贰仟贰佰亿零叁仟叁佰贰拾肆万叁仟叁佰柒拾柒元叁角
9776105.8=====玖佰柒拾柒万陆仟壹佰零伍元捌角
57292342666.0=====伍佰柒拾贰亿玖仟贰佰叁拾肆万贰仟陆佰陆拾陆元
35581333.0=====叁仟伍佰伍拾捌万壹仟叁佰叁拾叁元
0.0=====零元
0.29=====零元贰角玖分
193138042.20=====壹亿玖仟叁佰壹拾叁万捌仟零肆拾贰元贰角
78998357458.0=====柒佰捌拾玖亿玖仟捌佰叁拾伍万柒仟肆佰伍拾捌元
33145487.0=====叁仟叁佰壹拾肆万伍仟肆佰捌拾柒元
00.79=====零元柒角玖分
470292516.0=====肆亿柒仟零贰拾玖万贰仟伍佰壹拾陆元
98537469302.32=====玖佰捌拾伍亿叁仟柒佰肆拾陆万玖仟叁佰零贰元叁角贰分
290881677448552.4=====贰佰玖拾兆零捌仟捌佰壹拾陆亿柒仟柒佰肆拾肆万捌仟伍佰伍拾贰元肆角
0509932.0=====伍拾万零玖仟玖佰叁拾贰元
515802410635.0=====伍仟壹佰伍拾捌亿零贰佰肆拾壹万零陆佰叁拾伍元
153522307121.0=====壹仟伍佰叁拾伍亿贰仟贰佰叁拾万零柒仟壹佰贰拾壹元
315649784.3=====叁亿壹仟伍佰陆拾肆万玖仟柒佰捌拾肆元叁角
08499254411.0=====捌拾肆亿玖仟玖佰贰拾伍万肆仟肆佰壹拾壹元
865964.5=====捌拾陆万伍仟玖佰陆拾肆元伍角
8493.29=====捌仟肆佰玖拾叁元贰角玖分
899808991634.53=====捌仟玖佰玖拾捌亿零捌佰玖拾玖万壹仟陆佰叁拾肆元伍角叁分
0.6=====零元陆角
4906936245491.0=====肆兆玖仟零陆拾玖亿叁仟陆佰贰拾肆万伍仟肆佰玖拾壹元
125399048.24=====壹亿贰仟伍佰叁拾玖万玖仟零肆拾捌元贰角肆分
7781832091052.0=====柒兆柒仟捌佰壹拾捌亿叁仟贰佰零玖万壹仟零伍拾贰元
3444548721635.4=====叁兆肆仟肆佰肆拾伍亿肆仟捌佰柒拾贰万壹仟陆佰叁拾伍元肆角
615398535213.2=====陆仟壹佰伍拾叁亿玖仟捌佰伍拾叁万伍仟贰佰壹拾叁元贰角
19740620.0=====壹仟玖佰柒拾肆万零陆佰贰拾元
908355661.0=====玖亿零捌佰叁拾伍万伍仟陆佰陆拾壹元
1527543856.9=====壹拾伍亿贰仟柒佰伍拾肆万叁仟捌佰伍拾陆元玖角
7515086625.6=====柒拾伍亿壹仟伍佰零捌万陆仟陆佰贰拾伍元陆角
5303705705.5=====伍拾叁亿零叁佰柒拾万零伍仟柒佰零伍元伍角
3610554919937.4=====叁兆陆仟壹佰零伍亿伍仟肆佰玖拾壹万玖仟玖佰叁拾柒元肆角
72677.2=====柒万贰仟陆佰柒拾柒元贰角
7436163894691.0=====柒兆肆仟叁佰陆拾壹亿陆仟叁佰捌拾玖万肆仟陆佰玖拾壹元
76448611.36=====柒仟陆佰肆拾肆万捌仟陆佰壹拾壹元叁角陆分
2004947835.0=====贰拾亿零肆佰玖拾肆万柒仟捌佰叁拾伍元
5652635143936.0=====伍兆陆仟伍佰贰拾陆亿叁仟伍佰壹拾肆万叁仟玖佰叁拾陆元
72247114002445.6=====柒拾贰兆贰仟肆佰柒拾壹亿壹仟肆佰万零贰仟肆佰肆拾伍元陆角
943331110563734.0=====玖佰肆拾叁兆叁仟叁佰壹拾壹亿壹仟零伍拾陆万叁仟柒佰叁拾肆元
20265842.94=====贰仟零贰拾陆万伍仟捌佰肆拾贰元玖角肆分
7571728827241211.0=====柒仟伍佰柒拾壹兆柒仟贰佰捌拾捌亿贰仟柒佰贰拾肆万壹仟贰佰壹拾壹元
86256.0=====捌万陆仟贰佰伍拾陆元
77.50=====柒拾柒元伍角
25266950163.0=====贰佰伍拾贰亿陆仟陆佰玖拾伍万零壹佰陆拾叁元
968140.9=====玖拾陆万捌仟壹佰肆拾元玖角
829131829905753.0=====捌佰贰拾玖兆壹仟叁佰壹拾捌亿贰仟玖佰玖拾万零伍仟柒佰伍拾叁元
4208933.0=====肆佰贰拾万零捌仟玖佰叁拾叁元
8110046236702960.0=====捌仟壹佰壹拾兆零肆佰陆拾贰亿叁仟陆佰柒拾万零贰仟玖佰陆拾元
428847.10=====肆拾贰万捌仟捌佰肆拾柒元壹角
130952521582670.0=====壹佰叁拾兆零玖仟伍佰贰拾伍亿贰仟壹佰伍拾捌万贰仟陆佰柒拾元
24.35=====贰拾肆元叁角伍分
81534639.0=====捌仟壹佰伍拾叁万肆仟陆佰叁拾玖元
5832.8=====伍仟捌佰叁拾贰元捌角
3091057217.0=====叁拾亿零玖仟壹佰零伍万柒仟贰佰壹拾柒元
142027.0=====壹拾肆万贰仟零贰拾柒元
1.0=====壹元
535245974.20=====伍亿叁仟伍佰贰拾肆万伍仟玖佰柒拾肆元贰角
548618.0=====伍拾肆万捌仟陆佰壹拾捌元
725699663.0=====柒亿贰仟伍佰陆拾玖万玖仟陆佰陆拾叁元
13070168733.0=====壹佰叁拾亿零柒仟零壹拾陆万捌仟柒佰叁拾叁元
0.0=====零元
7634.0=====柒仟陆佰叁拾肆元
104.57=====壹佰零肆元伍角柒分
886878.15=====捌拾捌万陆仟捌佰柒拾捌元壹角伍分
2161710482.92=====贰拾壹亿陆仟壹佰柒拾壹万零肆佰捌拾贰元玖角贰分
22862898517211.3=====贰拾贰兆捌仟陆佰贰拾捌亿玖仟捌佰伍拾壹万柒仟贰佰壹拾壹元叁角

涉及到的依赖包工具

 <!--常用工具类 -->
 <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
  </dependency>

需注意

  1. 对于小数点0.02这种,转换后是零元贰分,有些可能要求转换零元零贰分。

以上示例若有其他bug问题,请联系告知。谢谢

猜你喜欢

转载自blog.csdn.net/weixin_49114503/article/details/134547549