1、如何将阿拉伯数字金额转换成中文大写金额

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by IntelliJ IDEA
 * 这是一个神奇的Class,阿拉伯数字金额转换成中文大写金额
 *
 * @author zhz
 * @date 2019/10/19 17:03
 */
public class NumberToChineseUtil {
    private static final Pattern AMOUNT_PATTERN =
            Pattern.compile("^(0|[1-9]\\d{0,11})\\.(\\d\\d)$"); // 不考虑分隔符的正确性
    private static final char[] RMB_NUMS = "零壹贰叁肆伍陆柒捌玖".toCharArray();
    private static final String[] UNITS = {"元", "角", "分", "整"};
    private static final String[] U1 = {"", "拾", "佰", "仟"};
    private static final String[] U2 = {"", "万", "亿"};

    /**
     * 将金额(整数部分等于或少于12位,小数部分2位)转换为中文大写形式.
     * @param amount 金额数字
     * @return       中文大写
     * @throws IllegalArgumentException
     */
    public static String convert(String amount) throws IllegalArgumentException {
        // 去掉分隔符
        amount = amount.replace(",", "");

        // 验证金额正确性
        if (amount.equals("0.00")) {
            throw new IllegalArgumentException("金额不能为零.");
        }
        Matcher matcher = AMOUNT_PATTERN.matcher(amount);
        if (! matcher.find()) {
            throw new IllegalArgumentException("输入金额有误.");
        }

        String integer  = matcher.group(1); // 整数部分
        String fraction = matcher.group(2); // 小数部分

        String result = "";
        if (! integer.equals("0")) {
            result += integer2rmb(integer) + UNITS[0]; // 整数部分
        }
        if (fraction.equals("00")) {
            result += UNITS[3]; // 添加[整]
        } else if (fraction.startsWith("0") && integer.equals("0")) {
            result += fraction2rmb(fraction).substring(1); // 去掉分前面的[零]
        } else {
            result += fraction2rmb(fraction); // 小数部分
        }

        return result;
    }

    // 将金额小数部分转换为中文大写
    private static String fraction2rmb(String fraction) {
        char jiao = fraction.charAt(0); //
        char fen  = fraction.charAt(1); //
        return (RMB_NUMS[jiao - '0'] + (jiao > '0' ? UNITS[1] : ""))
                + (fen > '0' ? RMB_NUMS[fen - '0'] + UNITS[2] : "");
    }

    // 将金额整数部分转换为中文大写
    private static String integer2rmb(String integer) {
        StringBuilder buffer = new StringBuilder();
        // 从个位数开始转换
        int i, j;
        for (i = integer.length() - 1, j = 0; i >= 0; i--, j++) {
            char n = integer.charAt(i);
            if (n == '0') {
                // 当n是0且n的右边一位不是0时,插入[零]
                if (i < integer.length() - 1 && integer.charAt(i + 1) != '0') {
                    buffer.append(RMB_NUMS[0]);
                }
                // 插入[万]或者[亿]
                if (j % 4 == 0) {
                    if (i > 0 && integer.charAt(i - 1) != '0'
                            || i > 1 && integer.charAt(i - 2) != '0'
                            || i > 2 && integer.charAt(i - 3) != '0') {
                        buffer.append(U2[j / 4]);
                    }
                }
            } else {
                if (j % 4 == 0) {
                    buffer.append(U2[j / 4]);     // 插入[万]或者[亿]
                }
                buffer.append(U1[j % 4]);         // 插入[拾]、[佰]或[仟]
                buffer.append(RMB_NUMS[n - '0']); // 插入数字
            }
        }
        return buffer.reverse().toString();
    }
    /**
     * 对金额的格式调整到分
     * @param money
     * @return
     */
    public static String moneyFormat(String money){//23->23.00
        StringBuffer sb=new StringBuffer();
        if(money==null){
            return "0.00";
        }
        int index=money.indexOf(".");
        if(index==-1){
            return money+".00";
        }else{
            String s0=money.substring(0,index);//整数部分
            String s1=money.substring(index+1);//小数部分
            if(s1.length()==1){//小数点后一位
                s1=s1+"0";
            }else if(s1.length()>2){//如果超过3位小数,截取2位就可以了
                s1=s1.substring(0,2);
            }
            sb.append(s0);
            sb.append(".");
            sb.append(s1);
        }
        return sb.toString();
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(NumberToChineseUtil.moneyFormat("16"));
        System.out.println(NumberToChineseUtil.convert("2.00"));
    }
}

结果如下:

 

 2、阿拉伯数字转换成中文数字

/**
 * Created by IntelliJ IDEA
 * 这是一个神奇的Class,阿拉伯数字转换成中文数字
 *
 * @author zhz
 * @date 2019/10/19 17:13
 */
public class NumberConventer {
    /// <summary>
    /// 阿拉伯數字轉中文
    /// </summary>
    /// <param name="intInput"></param>
    /// <returns></returns>
    public static String ToConvtZH(Integer intInput)
    {
        String sd = ToCH(intInput);
        String sd2 = sd;
        if (intInput== 10)
        {
            //sd2 = sd.insert(sd.lastIndexOf('十'), "一");
            sd2 = "十";
        }
        return sd2;
    }

    public static String ToCH(Integer intInput)
    {
        String si = intInput.toString();
        String sd = "";
        if (si.length() == 1)     //
        {
            sd += GetCH(intInput);
            return sd;
        }
        else if (si.length() == 2)//
        {
            if (si.substring(0, 1) == "1")
                sd += "十";
            else
                sd += (GetCH(intInput / 10) + "十");
            sd += ToCH(intInput % 10);
        }
        else if (si.length() == 3)//
        {
            sd += (GetCH(intInput / 100) + "百");
            if (String.valueOf(intInput % 100).length() < 2 && (intInput % 100) != 0)
                sd += "零";
            sd += ToCH(intInput % 100);
        }
        else if (si.length() == 4)//
        {
            sd += (GetCH(intInput / 1000) + "千");
            if (String.valueOf(intInput % 1000).length() < 3 && (intInput % 1000) != 0)
                sd += "零";
            sd += ToCH(intInput % 1000);
        }
        else if (si.length() == 5)//
        {
            sd += (GetCH(intInput / 10000) + "万");
            if (String.valueOf(intInput % 10000).length() < 4 && (intInput % 10000) != 0)
                sd += "零";
            sd += ToCH(intInput % 10000);
        }

        return sd;
    }

    private static String GetCH(int input)
    {
        String sd = "";
        switch (input)
        {
            case 1:
                sd = "一";
                break;
            case 2:
                sd = "二";
                break;
            case 3:
                sd = "三";
                break;
            case 4:
                sd = "四";
                break;
            case 5:
                sd = "五";
                break;
            case 6:
                sd = "六";
                break;
            case 7:
                sd = "七";
                break;
            case 8:
                sd = "八";
                break;
            case 9:
                sd = "九";
                break;
            default:
                break;
        }
        return sd;
    }


    /**
     * 支持到12位
     *
     * @param numberStr 中文数字
     * @return int 数字
     */
    public static int getIntegerByNumberStr(String numberStr) {

        // 返回结果
        int sum = 0;

        // null或空串直接返回
        if (numberStr == null || ("").equals(numberStr)) {
            return sum;
        }

        // 过亿的数字处理
        if (numberStr.indexOf("亿") > 0) {
            String currentNumberStr = numberStr.substring(0, numberStr.indexOf("亿"));
            int currentNumber = testA(currentNumberStr);
            sum += currentNumber * Math.pow(10, 8);
            numberStr = numberStr.substring(numberStr.indexOf("亿") + 1);
        }

        // 过万的数字处理
        if (numberStr.indexOf("万") > 0) {
            String currentNumberStr = numberStr.substring(0, numberStr.indexOf("万"));
            int currentNumber = testA(currentNumberStr);
            sum += currentNumber * Math.pow(10, 4);
            numberStr = numberStr.substring(numberStr.indexOf("万") + 1);
        }

        // 小于万的数字处理
        if (!("").equals(numberStr)) {
            int currentNumber = testA(numberStr);
            sum += currentNumber;
        }

        return sum;
    }

    /**
     * 把亿、万分开每4位一个单元,解析并获取到数据
     * @param testNumber
     * @return
     */
    public static int testA(String testNumber) {
        // 返回结果
        int sum = 0;

        // null或空串直接返回
        if(testNumber == null || ("").equals(testNumber)){
            return sum;
        }

        // 获取到千位数
        if (testNumber.indexOf("千") > 0) {
            String currentNumberStr = testNumber.substring(0, testNumber.indexOf("千"));
            sum += testB(currentNumberStr) * Math.pow(10, 3);
            testNumber = testNumber.substring(testNumber.indexOf("千") + 1);
        }

        // 获取到百位数
        if (testNumber.indexOf("百") > 0) {
            String currentNumberStr = testNumber.substring(0, testNumber.indexOf("百"));
            sum += testB(currentNumberStr) * Math.pow(10, 2);
            testNumber = testNumber.substring(testNumber.indexOf("百") + 1);
        }

        // 对于特殊情况处理 比如10-19是个数字,十五转化为一十五,然后再进行处理
        if (testNumber.indexOf("十") == 0) {
            testNumber = "一" + testNumber;
        }

        // 获取到十位数
        if (testNumber.indexOf("十") > 0) {
            String currentNumberStr = testNumber.substring(0, testNumber.indexOf("十"));
            sum += testB(currentNumberStr) * Math.pow(10, 1);
            testNumber = testNumber.substring(testNumber.indexOf("十") + 1);
        }

        // 获取到个位数
        if(!("").equals(testNumber)){
            sum += testB(testNumber.replaceAll("零",""));
        }

        return sum;
    }

    public static int testB(String replaceNumber) {
        switch (replaceNumber) {
            case "一":
                return 1;
            case "二":
                return 2;
            case "三":
                return 3;
            case "四":
                return 4;
            case "五":
                return 5;
            case "六":
                return 6;
            case "七":
                return 7;
            case "八":
                return 8;
            case "九":
                return 9;
            case "零":
                return 0;
            default:
                return 0;
        }
    }

    public static void main(String[] args) {
        for (int i=0;i<50;i++){
            String _number = NumberConventer.ToConvtZH(i);
            int j = NumberConventer.getIntegerByNumberStr("一");
            System.err.println(i+"===="+_number+"----->"+"一==="+j);
        }
        Integer aa = 10;
        String _number = NumberConventer.ToConvtZH(aa);
        System.out.println(_number);
    }

结果如下:

 

 

posted on 2019-11-08 10:05  遥-ZHZ  阅读(503)  评论(0编辑  收藏  举报