`
yangzy666
  • 浏览: 19507 次
  • 性别: Icon_minigender_1
  • 来自: 东莞
社区版块
存档分类
最新评论

阿拉伯数字金额转中文大写金额

阅读更多

在工作中因为报表需要,自己写了个简单的金额中文大写转换,权当训练一下思维。当然也有代码优化的空间,欢迎指正。

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.bestway.jptds.client.common;

import java.math.RoundingMode;
import java.text.NumberFormat;
import java.util.HashMap;
import java.util.Map;

/**
 * 将阿拉伯数字金额转换成中文大写数字金额的转换类
 * @author yzy
 */
public class ConvertToCNMoney {

    /**
     * 将阿拉伯数字金额转换成中文大写数字金额
     * @param money
     * @return
     */
    public static String toCNMoney(double money) {
        //转换成指定格式的数字
        NumberFormat fmt = NumberFormat.getInstance();
        fmt.setMaximumFractionDigits(2);//两位小数
        fmt.setRoundingMode(RoundingMode.HALF_UP);
        fmt.setGroupingUsed(false);//不要千分号

        money = Double.valueOf(fmt.format(money));

        Map<Integer, String> numbersMap = new HashMap<Integer, String>(10);
        String[] section = {"", "萬", "億", "兆"};//拆分为四大块,精确到万亿位,即兆
//      String[] positions = {"拾", "佰", "仟"};
        String[] numbers = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
        for (int i = 0; i < numbers.length; i++) {
            numbersMap.put(i, numbers[i]);
        }

        String result = "";
        //1.处理小数位(如果有)
        if (fmt.format(money).contains(".")) {
            int remainder = (int) ((money * 100) % 100);//取余

            int a = remainder / 10;
            if (a != 0) {
                result = numbersMap.get(a) + "角";
            }

            int b = remainder % 10;
            if (b != 0) {
                if (a == 0) {
                    result += numbersMap.get(0) + numbersMap.get(b) + "分";//处理特殊情况,如2.05(贰圆零伍分)
                } else {
                    result += numbersMap.get(b) + "分";
                }
            }
        }

        //2.处理整数位
        long total = (long) (money * 100 / 100);//取整
        if (total == 0) {
            return result.equals("") ? (numbersMap.get(0) + "圆") : result;//少于1元
        }

        int j = 0;
        String tempResult = "";
        do {
            //每次处理四位数
            long t = (total % 10000);
            String str = ConvertToCNMoney.thousandToUpperCase((int) t, numbersMap, null);
            total = total / 10000;
            if (total != 0 && t > 0 && t < 1000) {
                str = numbersMap.get(0) + str;//如果每次处理之后还有万位且前次处理的四位取余t(0<t<1000),则前面应补零
            }
            tempResult = str + section[j] + tempResult;
            j++;
        } while (total != 0);

        //3.最后别忘了金额单位
        result = tempResult + "圆" + result;
        return result;
    }

    /**
     * 处理千位以内阿拉伯数字金额
     * @param number
     * @param numbersMap
     * @param result
     * @return
     */
    private static String thousandToUpperCase(int number, Map<Integer, String> numbersMap, String result) {
        result = result == null ? "" : result;
        if (number < 10) {
            return number == 0 ? result : (result + numbersMap.get(number));//取出个位
        }
        if (number < 100) {
            result = result + numbersMap.get(number / 10) + "拾";//取出十位
            return thousandToUpperCase(number % 10, numbersMap, result);
        }
        if (number < 1000) {
            result = result + numbersMap.get(number / 100) + "佰";//取出百位
            //处理特殊情况,如201
            if (0 < number % 100 && number % 100 < 10) {
                result += numbersMap.get(0);//加个零
            }
            return thousandToUpperCase(number % 100, numbersMap, result);
        }
        if (number < 10000) {
            result = result + numbersMap.get(number / 1000) + "仟";//取出千位
            //处理特殊情况,如2001,2011
            if (0 < number % 1000 && number % 1000 < 100) {
                result += numbersMap.get(0);//加个零
            }
            return thousandToUpperCase(number % 1000, numbersMap, result);
        }
        return result;
    }
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics