找工作中,遇到一个java金额转换的题目,在网上查找了一些资料,看了不是太容易理解,理解能力不好。在此分享在吸取大神们处理方式的基础上自己整理的一个小程序,希望可以帮助到大家,也是自己的一个笔记。

  代码如下:

 

import java.math.BigDecimal;

public class Convert {

    static String cashUnitLeft[] = { "元", "拾", "佰", "仟", "万", "拾", "佰", "仟","亿", "拾", "佰", "仟", "万" };
    static String cashUnitRight[] = { "角", "分", "厘" };
    static String upperNumber[] = { "零", "壹", "贰", "弎", "肆", "伍", "陆", "柒","捌", "玖" };

    public static String convert(BigDecimal money) {

        String smoney = money.toString();
        try{
            if (smoney.indexOf(".") != -1) {                        //把数值分为整数型和带小数的数值分开处理。
                String left = smoney.substring(0, smoney.indexOf("."));
                String right = smoney.substring(smoney.indexOf(".") + 1);
                String result = convertLeft(left) + convertRight(right);
                
                return result;
            } else {
                return convertLeft(smoney);
            }
        }catch(IllegalArgumentException e){
            System.out.println(e.getMessage());
            System.out.println("请输入转换范围内现金");
            return null;
        }
    }

    private static String convertLeft(String left) {                //处理整数部分。

        int length = left.length();                                    //根据单位'亿','万','元',把整数部分分为3种情况处理。

        if (length <= 4) {                                            //金额在千元以内。
            if(length == 1 && Integer.valueOf(left) == 0)            //金额为'0'元时的特殊情况。
                return "零元";
            return convertPart(left, length);
        } else if (length <= 8) {                                    //金额在千万元以内。

            String part1 = left.substring(0,length - 4);
            String part2 = left.substring(length - 4, length);
            
            String result1 = convertPart(part1, length);
            String result2 = convertPart(part2, 4);

            return result1 + result2;
        } else if (length <= 12) {                                    //金额在千亿元以内。

            String part1 = left.substring(0, length - 8);            //截取单位为'亿'部分数值。
            String part2 = left.substring(length - 8, length - 4);    //截取单位为'万'部分数值。
            String part3 = left.substring(length - 4, length);        //截取单位为'元'部分数值。
            
            String result1 = convertPart(part1, length);            //转换单位为'亿'部分数值。
            String result2 = convertPart(part2, 8);                    //转换单位为'万'部分数值。
            String result3 = convertPart(part3, 4);                    //转换单位为'元'部分数值。
            
            String result = result1 + result2 + result3;
            return result;
        } else {
            throw new IllegalArgumentException("超出转换数值范围!");
        }

    }

    private static String convertRight(String right) {                //处理小数部分。

        String result = "";
        String number = "";
        String unit = "";

        int length = right.length();

        for (int i = 0; i < length; i++) {
            String detail = right.substring(i, i + 1);
            int value = Integer.valueOf(detail);
number = upperNumber[value];
       unit = cashUnitRight[i];
            result = result.concat(number).concat(unit);
        }

        result = result.replaceAll("零角", "").replaceAll("零分", "").replaceAll("零厘", "");
        return result;
    }

    private static String convertPart(String part, int position) {

        String result = "";
        String number = "";
        String unit = "";

        if(part.equals("0000") && position == 8)                            //用于排除单位为'万'时,四位数值均为'0'的情况。
            return "";
        for (int i = 0; i < part.length(); i++) {
            int value = Integer.valueOf(String.valueOf(part.charAt(i)));
            number = upperNumber[value];
            unit = cashUnitLeft[position - 1 - i];
            result = result.concat(number).concat(unit);
        }
        
        result = result.replaceAll("零仟", "零").replaceAll("零佰", "零")        //把单位'亿','万','元'放到最后替换。
                .replaceAll("零拾", "零").replaceAll("零零", "零")
                .replaceAll("零零", "零").replaceAll("零亿", "亿")
                .replaceAll("零万", "万").replaceAll("零元", "元");
                //        result = result.replaceAll("零仟", "零");
                //        result = result.replaceAll("零佰", "零");
                //        result = result.replaceAll("零拾", "零");
                //        result = result.replaceAll("零零", "零");
                //        result = result.replaceAll("零零", "零");
                //        result = result.replaceAll("零亿", "亿");
                //        result = result.replaceAll("零万", "万");
                //        result = result.replaceAll("零元", "元");
        
        System.out.println(result);
        return result;
    }
    
    public static void main(String[] args) {
        
        BigDecimal money = new BigDecimal("123456789123.789");
        System.out.println("Before convert:" + money);
        String result = convert(money);
        System.out.println("After convert:" + result);
    }
}

  运行结果

  

Before convert:123456789123.789
壹仟贰佰弎拾肆亿
伍仟陆佰柒拾捌万
玖仟壹佰贰拾弎元
After convert:壹仟贰佰弎拾肆亿伍仟陆佰柒拾捌万玖仟壹佰贰拾弎元柒角捌分玖厘

 

  目前程序可以做一些金额大小写的转换,边写边改,自己测了一下常见的情况,可以正常转换。

  思路不是太好,欢迎大家批评指教。