數字格式化工具

數字格式化工具,還沒在網上搜索其餘的數字格式化工具,暫時寫這個頂替一下,數據格式化還存在不少問題,暫時能知足要求吧。之後再慢慢的調整修改。java

package com.common.util;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by rico on 2016/12/23.
 * 數字格式戶工具
 */
public class DigitalUtil {
    private static final Logger logger = LoggerFactory.getLogger(DigitalUtil.class);


    /**
     * 分割數據
     * @param digit
     * @return
     */
    public static List<Integer> divideDigit(int digit) {
        List<Integer> digits = new ArrayList<Integer>();
        return recurseDivide(digit, digits);
    }

    /**
     * 遞歸分割數據
     * @param digit
     * @param digits
     * @return
     */
    public static List<Integer> recurseDivide(int digit, List<Integer> digits) {
        int result = digit % 10;
        digits.add(result);

        int sub = digit / 10;
        if(sub != 0) {
            recurseDivide(sub, digits);
        }

        return digits;
    }

    /**
     *
     * @return
     */
    public static List<String> getDigitalUnits() {
        List<String> units = new ArrayList<String>();

        units.add("十");
        units.add("百");
        units.add("千");
        units.add("");
        units.add("十");
        units.add("百");
        units.add("千");
        units.add("");

        return units;
    }

    public static Map<Integer, String> getDigitalUnitsMap() {
        Map<Integer, String> units = new HashMap<Integer, String>();

        //units.put(2, "十");
        //units.put(3, "百");
        //units.put(4, "千");
        units.put(5, "萬");
        units.put(9, "億");

        return units;
    }

    /**
     * 數字對應中文數字
     * @return
     */
    public static Map<Integer, String> digitToStringMap() {
        Map<Integer, String> numberMap = new HashMap<Integer, String>();
        numberMap.put(0, "零");
        numberMap.put(1, "一");
        numberMap.put(2, "二");
        numberMap.put(3, "三");
        numberMap.put(4, "四");
        numberMap.put(5, "五");
        numberMap.put(6, "六");
        numberMap.put(7, "七");
        numberMap.put(8, "八");
        numberMap.put(9, "九");
        //numberMap.put(10, "十");

        return numberMap;
    }

    /**
     * 數字對應中文數字 - "0"="〇"
     * @return
     */
    public static Map<Integer, String> digitToStringMap2() {
        Map<Integer, String> map = digitToStringMap();
        map.put(0, "〇");

        return map;
    }

    /**
     * 數字年份轉換爲中文年份
     * @param year
     * @return
     */
    public static String converYearToString(int year) {
        Map<Integer, String> defaultMap = digitToStringMap();
        return converYearToString(year, defaultMap);
    }

    /**
     * 數字年份轉換爲中文年份
     * @param year
     * @param digitToStringMap
     * @return
     */
    public static String converYearToString(int year, Map<Integer, String> digitToStringMap) {
        // 分割數字
        List<Integer> digits = divideDigit(year);

        StringBuffer buff = new StringBuffer();
        for(int i=digits.size()-1; i>=0; i--) {
            String str = digitToStringMap.get(digits.get(i));

            if(StringUtils.isBlank(str)) {
                str = String.valueOf(digits.get(i));
            }

            buff.append(str);
        }

        return buff.toString();
    }

    /**
     * 將數字轉換爲中文
     * @param digit
     * @return
     */
    public static String converDigitToString(int digit) {
        // 數字對應中文數字
        Map<Integer, String> digitToStringMap = digitToStringMap();

        // 0直接返回
        if(digit == 0) {
            return digitToStringMap.get(0);
        }

        // 分割數字
        List<Integer> digits = divideDigit(digit);

        // 數字單位
        List<String> units = getDigitalUnits();
        Map<Integer, String> unitMaps = getDigitalUnitsMap();



        // 計算數字尾部0個數
        int zoreAmount = calZoreDigitAmountTail(digit);

        // 是否爲0標識
        boolean isZeroPrevious = false;
        StringBuffer buff = new StringBuffer();

        for(int i=digits.size()-1; i>=zoreAmount; i--) {
            String str = digitToStringMap.get(digits.get(i));

            if(StringUtils.isBlank(str)) {
                str = String.valueOf(digits.get(i));
            }

            if(digits.get(i) == 0 ) {
                if(i!=0 && !isZeroPrevious && !unitMaps.containsKey(i+1)) {
                    // 不是最後一位數字,前面數字非0
                    buff.append(str);
                    isZeroPrevious = true;

                } else {

                }

            } else {
                isZeroPrevious = false;
                buff.append(str);
            }

            if(i>0 && !isZeroPrevious) {
                String unit = units.get(i-1)==null?"":units.get(i-1);
                buff.append(unit);
            }

            // 分隔符,5位:萬分隔,9位:億分隔
            String digitUnit = unitMaps.get(i+1)==null?"":unitMaps.get(i+1);
            buff.append(digitUnit);
        }

        //TODO
        String result = buff.toString().replace("一十", "十");

        return result;
    }

    /**
     * 計算數字尾部0個數
     * @param digit
     * @return
     */
    public static int calZoreDigitAmountTail(int digit) {
        int amount = 0;

        int mod = digit % 10;
        while(mod == 0) {
            amount ++;

            digit = digit / 10;
            mod = (digit) % 10;
        }

        return amount;
    }

}
相關文章
相關標籤/搜索