数字转中文数字与中文数字转数字

利用数组与map的数据结构进行中文数字与数字之间的互相转换

public class NumberUtil {

    private NumberUtil() { }

    private static final char[] CN_NUM = {'零', '一', '二', '三', '四','五','六','七','八','九'};

    private static final char[] CN_UNIT = {' ', '十', '百', '千', '万', '十', '百', '千', '亿', '十', '百', '千'};

    private static final String CN_NEGATIVE = "负";

    private static final String CN_POINT = "点";

    private static final String [] CN_UNIT_SYMBOL = {"十", "百", "千", "万","亿"};

    private static  Map<Character,String> NUM_MAP = null;
    static {
        Map<Character,String> map = new HashMap<>();
        map.put('零',"0");
        map.put('一',"1");
        map.put('二',"2");
        map.put('三',"3");
        map.put('四',"4");
        map.put('五',"5");
        map.put('六',"6");
        map.put('七',"7");
        map.put('八',"8");
        map.put('九',"9");
        map.put('点',".");
        map.put('负',"-");
        NUM_MAP = map;
    }
    /**
     *  @param bigDecimalNum
     *  @return 中文数字
     */
    public static String bigDecimalChineseNum(BigDecimal bigDecimalNum) {

    if (bigDecimalNum == null) {
        return "零";
    }
    StringBuffer sb = new StringBuffer();

    //将小数点后面的零给去除
    String numStr = bigDecimalNum.abs().stripTrailingZeros().toPlainString();
    String[] split = numStr.split("\\.");
    String integerStr = intChineseNum(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++) {
             sb.append(CN_NUM[Integer.parseInt(String.valueOf(chars[i]))]);
         }
     }

    //判断传入数字为正数还是负数
     int signum = bigDecimalNum.signum();

     if (signum == -1) {
         sb.insert(0, CN_NEGATIVE);
     }
     return sb.toString();
    }
    /** *
     * int 转 中文数字
     * 支持到int最大值
     *  @param intNum 要转换的整型数
     *  @return 中文数字
     * */
    public static String intChineseNum(int intNum ){
        StringBuffer sb = new StringBuffer();

        //将负数转换为正数
        if (intNum < 0) {
            intNum *= -1;
            sb.append(CN_NEGATIVE);
        }

        char [] chats = (intNum + "").toCharArray();
        int index = chats.length-1;
        for (int i = 0; i < chats.length; i++) {
            sb.append((CN_NUM[Integer.valueOf(String.valueOf(chats[i]))]+"")+CN_UNIT[index-i]);
        }
        return sb.toString().trim()
                .replaceAll("零[千百十]", "零")
                .replaceAll("零+万", "万")
                .replaceAll("零+亿", "亿")
                .replaceAll("亿万", "亿零")
                .replaceAll("零+", "零")
                .replaceAll("零$", "");
    }

    /**
     * 中文数字 转 int
     * @param num 转换的中文数字
     * @return int
     */
    public static int intNumber(String num){
        return Integer.valueOf(core(num));
    }
    /**
     * 中文数字 转 BigDecimal
     * @param num 转换的中文数字
     * @return BigDecimal
     */
    public static BigDecimal bigDecimalNumber(String num){
        return new BigDecimal(core(num));
    }

    private static String core(String num){
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < CN_UNIT_SYMBOL.length; i++) {
            num = num.replaceAll(CN_UNIT_SYMBOL[i], "");
        }
        char[] chars = num.toCharArray();
        for (Character aChar : chars) {
            sb.append(NUM_MAP.get(aChar));
        }
        return sb.toString();
    }

//    public static void main(String[] args) {
//        int num = 48616;
//        String nums = "48616.33";
//        String chineseNum = intChineseNum(num);
//        String bigDecimalChineseNum = bigDecimalChineseNum(new BigDecimal(nums));
//
//        System.out.println(chineseNum);
//        System.out.println(bigDecimalChineseNum);
//
//        int number = intNumber(chineseNum);
//        BigDecimal bigDecimal = bigDecimalNumber(bigDecimalChineseNum);
//
//        System.out.println(number);
//        System.out.println(bigDecimal);
//    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值