使用Java將阿拉伯數字轉換爲中文數字(適配小數轉換)

Java數字轉換工具類

本文借鑑了該博主所寫的工具類
傳送門:https://blog.csdn.net/wanlin77/article/details/88853816
初級碼農一枚,非常歡迎優化、交流

簡介

該工具類可以將整數、小數、負數轉換爲中文的數字,如:

  • 0 ——>
  • 1 ——>
  • 2.1 ——> 二點一
  • -2.1 ——> 負二點一

具體代碼如下

import java.math.BigDecimal;

/**
 * 數字轉換中文
 *
 * @author huangshuai
 * @date 2019/11/22 0022
 */
public class NumberUtil {

    private NumberUtil() { }

    /**
     * 中文數字
     */
    private static final String[] CN_NUM = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};

    /**
     * 中文數字單位
     */
    private static final String[] CN_UNIT = {"", "十", "百", "千", "萬", "十", "百", "千", "億", "十", "百", "千"};

    /**
     * 特殊字符:負
     */
    private static final String CN_NEGATIVE = "負";

    /**
     * 特殊字符:點
     */
    private static final String CN_POINT = "點";


    /**
     * int 轉 中文數字
     * 支持到int最大值
     * 
     * @param intNum 要轉換的整型數
     * @return 中文數字
     */
    public static String int2chineseNum(int intNum) {
        StringBuffer sb = new StringBuffer();
        boolean isNegative = false;
        if (intNum < 0) {
            isNegative = true;
            intNum *= -1;
        }
        int count = 0;
        while(intNum > 0) {
            sb.insert(0, CN_NUM[intNum % 10] + CN_UNIT[count]);
            intNum = intNum / 10;
            count++;
        }

        if (isNegative)
            sb.insert(0, CN_NEGATIVE);


        return sb.toString().replaceAll("零[千百十]", "零").replaceAll("零+萬", "萬")
                .replaceAll("零+億", "億").replaceAll("億萬", "億零")
                .replaceAll("零+", "零").replaceAll("零$", "");
    }

    /**
     * bigDecimal 轉 中文數字
     * 整數部分只支持到int的最大值
     * 
     * @param bigDecimalNum 要轉換的BigDecimal數
     * @return 中文數字
     */
    public static String bigDecimal2chineseNum(BigDecimal bigDecimalNum) {
        if (bigDecimalNum == null)
            return CN_NUM[0];

        StringBuffer sb = new StringBuffer();

        //將小數點後面的零給去除
        String numStr = bigDecimalNum.abs().stripTrailingZeros().toPlainString();

        String[] split = numStr.split("\\.");
        String integerStr = int2chineseNum(Integer.parseInt(split[0]));

        sb.append(integerStr);

        //如果傳入的數有小數,則進行切割,將整數與小數部分分離
        if (split.length == 2) {
            //有小數部分
            sb.append(CN_POINT);
            String decimalStr = split[1];
            char[] chars = decimalStr.toCharArray();
            for (int i = 0; i < chars.length; i++) {
                int index = Integer.parseInt(String.valueOf(chars[i]));
                sb.append(CN_NUM[index]);
            }
        }

        //判斷傳入數字爲正數還是負數
        int signum = bigDecimalNum.signum();
        if (signum == -1) {
            sb.insert(0, CN_NEGATIVE);
        }

        return sb.toString();
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章