java将数字转简体中文和繁体中文,支持金额模式

最近项目中用到金额转大写的地方,然后hutool里面正好有这个功能。
工具类路径:

cn.hutool.core.convert.Convert#digitToChinese

方法描述

/**
 * 金额转为中文形式
 * 
 * @param n 数字
 * @return 中文大写数字
 * @since 3.2.3
 */
public static String digitToChinese(Number n) {
    
    
	if(null == n) {
    
    
		return "零";
	}
	return NumberChineseFormatter.format(n.doubleValue(), true, true);
}

参数是Number类型,而Bigdecimal也是此类的子类,所以使用Bigdecimal和这个类就可以实现功能了

后来我又看了这个方法的实现,里面调用了NumberChineseFormatter这个类的方法,而这个类又封装了一层方法

cn.hutool.core.convert.NumberChineseFormatter#format(double, boolean, boolean)

这个方法多了两个参数,isUseTraditionalisMoneyMode,分别表示是否使用繁体大写和是否表示金额

/**
 * 阿拉伯数字转换成中文,小数点后四舍五入保留两位. 使用于整数、小数的转换.
 *
 * @param amount           数字
 * @param isUseTraditional 是否使用繁体
 * @param isMoneyMode      是否为金额模式
 * @return 中文
 */
public static String format(double amount, boolean isUseTraditional, boolean isMoneyMode) {
    
    
   //此处省略hutool方法体代码
}

isUseTraditional:是否转为繁体。false将阿拉伯数字转为 “一”, “二”, “三"简体形式,true将阿拉伯数字转换为"壹”, “贰”, "叁"繁体形式;

isMoneyMode:是否金额模式。false将数字转为纯中文数字,true将阿拉伯数字转为带"元",“角”,"分"的中文数字。

总结:如果用这个方法,既可以将数字转简体中文,又可以转为金额形式。

应用:

一、将阿拉伯数字序号转为简单中文数字:

List<Number> numbers = Arrays.asList(1,2.0,3.31,4.71,5.86);
System.out.println("数字转序号:");
numbers.forEach(item ->{
    
    
    System.out.println(NumberChineseFormatter.format(item.doubleValue(), false, false));
});

控制台输出:

数字转序号:

一
二
三点三一
四点七一
五点八六

二、将阿拉伯金额转为中文大写金额

  List<Number> numbers = Arrays.asList(1,2.0,3.31,4.71,5.86);
    System.out.println("数字转金额:");
    numbers.forEach(item ->{
    
    
        System.out.println(NumberChineseFormatter.format(item.doubleValue(), true, true));
    });

控制台输出:

数字转金额:

壹元整
贰元整
叁元叁角壹分
肆元柒角壹分
伍元捌角陆分

附:非hutool工具类

import com.guangyi.project.config.BDException;
import org.apache.commons.lang3.StringUtils;

/**
 * @Title: ConvertUpMoney
 * @Description:  将数字金额转换为大写中文金额
 * 
 */
public class ConvertUpMoney {
    
    

    // 大写数字
    private static final String[] NUMBERS = {
    
    "零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
    // 整数部分的单位
    private static final String[] IUNIT = {
    
    "元","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟","万","拾","佰","仟"};
    // 小数部分的单位
    private static final String[] DUNIT = {
    
    "角","分","厘"};


    /**
     *  转换为大写的中文金额
     * @param str 字符串类型的 金额数字
     * @return
     */
    public static String toChinese(String str) {
    
    
        // 判断输入的金额字符串是否符合要求
        if (StringUtils.isBlank(str) || !str.matches("(-)?[\\d]*(.)?[\\d]*")) {
    
    
            throw new BDException("金额不正确");
        }

        if("0".equals(str) || "0.00".equals(str) || "0.0".equals(str)) {
    
    
            return "零元";
        }

        // 判断金额数字中是否存在负号"-"
        boolean flag = false;
        if(str.startsWith("-")){
    
    
            // 标志位,标志此金额数字为负数
            flag = true;
            str = str.replaceAll("-", "");
        }

        // 去掉金额数字中的逗号","
        str = str.replaceAll(",", "");
        String integerStr;//整数部分数字
        String decimalStr;//小数部分数字

        // 初始化:分离整数部分和小数部分
        if(str.indexOf(".")>0) {
    
    
            integerStr = str.substring(0,str.indexOf("."));
            decimalStr = str.substring(str.indexOf(".") + 1);
        }else if(str.indexOf(".")==0) {
    
    
            integerStr = "";
            decimalStr = str.substring(1);
        }else {
    
    
            integerStr = str;
            decimalStr = "";
        }

        // beyond超出计算能力,直接返回
        if(integerStr.length()>IUNIT.length) {
    
    
            return "超出计算能力!";
        }

        // 整数部分数字
        int[] integers = toIntArray(integerStr);
        // 判断整数部分是否存在输入012的情况
        if (integers.length>1 && integers[0] == 0) {
    
    
            return "抱歉,输入数字不符合要求!";
        }
        // 设置万单位
        boolean isWan = isWan5(integerStr);
        // 小数部分数字
        int[] decimals = toIntArray(decimalStr);
        // 返回最终的大写金额
        String result = getChineseInteger(integers, isWan) + getChineseDecimal(decimals);
        if(flag){
    
    
            // 如果是负数,加上"负"
            return "负" + result;
        }else{
    
    
            return result;
        }
    }

    /**
     *  将字符串转为int数组
     * @param number  数字
     * @return
     */
    private static int[] toIntArray(String number) {
    
    
        int[] array = new int[number.length()];
        for(int i = 0;i<number.length();i++) {
    
    
            array[i] = Integer.parseInt(number.substring(i,i+1));
        }
        return array;
    }

    /**
     *  将整数部分转为大写的金额
     * @param integers 整数部分数字
     * @param isWan  整数部分是否已经是达到【万】
     * @return
     */
    public static String getChineseInteger(int[] integers,boolean isWan) {
    
    
        StringBuffer chineseInteger = new StringBuffer("");
        int length = integers.length;
        if (length == 1 && integers[0] == 0) {
    
    
            return "";
        }
        for(int i=0; i<length; i++) {
    
    
            String key = "";
            if(integers[i] == 0) {
    
    
                if((length - i) == 13)//万(亿)
                    key = IUNIT[4];
                else if((length - i) == 9) {
    
    //亿
                    key = IUNIT[8];
                }else if((length - i) == 5 && isWan) {
    
    //万
                    key = IUNIT[4];
                }else if((length - i) == 1) {
    
    //元
                    key = IUNIT[0];
                }
                if((length - i)>1 && integers[i+1]!=0) {
    
    
                    key += NUMBERS[0];
                }
            }
            chineseInteger.append(integers[i]==0?key:(NUMBERS[integers[i]]+IUNIT[length - i -1]));
        }
        return chineseInteger.toString();
    }

    /**
     *  将小数部分转为大写的金额
     * @param decimals 小数部分的数字
     * @return
     */
    private static String getChineseDecimal(int[] decimals) {
    
    
        StringBuffer chineseDecimal = new StringBuffer("");
        for(int i = 0;i<decimals.length;i++) {
    
    
            if(i == 3) {
    
    
                break;
            }
            chineseDecimal.append(decimals[i]==0?"":(NUMBERS[decimals[i]]+DUNIT[i]));
        }
        return chineseDecimal.toString();
    }

    /**
     *  判断当前整数部分是否已经是达到【万】
     * @param integerStr  整数部分数字
     * @return
     */
    private static boolean isWan5(String integerStr) {
    
    
        int length = integerStr.length();
        if(length > 4) {
    
    
            String subInteger = "";
            if(length > 8) {
    
    
                subInteger = integerStr.substring(length- 8,length -4);
            }else {
    
    
                subInteger = integerStr.substring(0,length - 4);
            }
            return Integer.parseInt(subInteger) > 0;
        }else {
    
    
            return false;
        }
    }


    // Test
    public static void main(String[] args) {
    
    
        String number = "12.56";
        System.out.println(number+": "+ConvertUpMoney.toChinese(number));

        number = "1234567890563886.123";
        System.out.println(number+": "+ConvertUpMoney.toChinese(number));

        number = "1600";
        System.out.println(number+": "+ConvertUpMoney.toChinese(number));

        number = "156,0";
        System.out.println(number+": "+ConvertUpMoney.toChinese(number));

        number = "-156,0";
        System.out.println(number+": "+ConvertUpMoney.toChinese(number));

        number = "0.12";
        System.out.println(number+": "+ConvertUpMoney.toChinese(number));

        number = "0.0";
        System.out.println(number+": "+ConvertUpMoney.toChinese(number));

        number = "01.12";
        System.out.println(number+": "+ConvertUpMoney.toChinese(number));

        number = "0125";
        System.out.println(number+": "+ConvertUpMoney.toChinese(number));

        number = "-0125";
        System.out.println(number+": "+ConvertUpMoney.toChinese(number));

        number = "sdw5655";
        System.out.println(number+": "+ConvertUpMoney.toChinese(number));

        System.out.println(null+": "+ConvertUpMoney.toChinese(null));
    }
}


猜你喜欢

转载自blog.csdn.net/qq_45228323/article/details/127390218