JAVA实现大写金额转小写金额

在金融行业中经常需要把大写金额转成小写金额,之前在一次开发中有个类似的需求,翻阅了好多博文,都没找到合适的,故没办法,就花了点时间研究并实现!

实现代码如下:

java 复制代码
    private static final Character ZERO = '零';
    private static final String DIME = "角";
    private static final String CENT = "分";
    private static final String DOLLAR = "元";
    private static final String THOUSAND = "万";
    private static final String HUNDRED_MILLION = "亿";

    private static final List<Character> unitList = Arrays.asList('圆', '元', '拾', '佰', '仟', '万', '亿');

    static Map<Char, Integer> numberMap = new HashMap(10) {{
        put('零', 0);
        put('壹', 1);
        put('贰', 2);
        put('叁', 3);
        put('肆', 4);
        put('伍', 5);
        put('陆', 6);
        put('柒', 7);
        put('捌', 8);
        put('玖', 9);
    }};

    static Map<Char, Long> unitZeroMap = new HashMap(7) {{
        put('亿', 100000000L);
        put('万', 10000L);
        put('仟', 1000L);
        put('佰', 100L);
        put('拾', 10L);
        put('元', 1L);
        put('圆', 1L);
    }};

    /**
     * 把大写金额转换为单位为分的数字
     */
    public static long convertMoneyNum(String money) {
        // 按亿/万/元(圆)/角/分拆分大写金额
        List<String> moneyList = buildMoneyList(money);
        long moneyNum = 0;
        long centMoneyNum = 0;
        for (String moneyStr : moneyList) {
            if (moneyStr.endsWith(DIME)) {
                centMoneyNum += (numberMap.get(moneyStr.charAt(0)) * 10);  // 大写角转数字分
            } else if (moneyStr.endsWith(CENT)) {
                centMoneyNum += numberMap.get(moneyStr.charAt(0));    // 大写分转数字分
            } else {
                moneyNum += convertNum(moneyStr);  // 大写亿/万/元(圆)转数字元
            }
        }
        // 返回计算后的数字分
        return moneyNum * 100 + centMoneyNum;
    }


    private static long convertNum(String moneyStr) {
        char[] chars = moneyStr.toCharArray();
        Set<Char> unitZeroList = unitZeroMap.keySet();
        long moneyNumber = 0;
        int indexNum = 0;
        int maxIndex = 0;
        Character preUnit = null;
        for (int i=0; i<chars.length; i++) {
            char currNum = chars[i];
            // 处理字符零
            if (currNum == ZERO) {
                preUnit = null;
                continue;
            }
            if (unitZeroList.contains(currNum)) {  // 处理字符为单位
                long unitNum = unitZeroMap.get(currNum);
                if (preUnit != null) {
                    moneyNumber = moneyNumber * unitNum;
                    preUnit = null;
                } else {
                    int currIndex = unitList.indexOf(currNum);
                    if (currIndex > maxIndex) {
                        maxIndex = currIndex;
                        moneyNumber = (moneyNumber + indexNum) * unitNum;
                    } else {
                        moneyNumber = moneyNumber + indexNum * unitNum;
                    }
                    preUnit = currNum;
                }
            } else {
                indexNum = numberMap.get(currNum);  // 处理字符为数字
                if (i == chars.length-1) {  // 最后一个字符为数字
                    moneyNumber = moneyNumber + indexNum;
                }
                preUnit = null;
            }
        }
        return moneyNumber;
    }

   private static List<String> buildMoneyList(String money) {
        List<String> moneyList = new ArrayList<>();
        int startIndex = 0;
        // 亿
        if (money.contains(HUNDRED_MILLION)) {
            startIndex = buildMoneyList(HUNDRED_MILLION, moneyList, money, startIndex);
        }
        // 万
        if (money.contains(THOUSAND)) {
            startIndex = buildMoneyList(THOUSAND, moneyList, money, startIndex);
        }
        // 元
        if (money.contains(DOLLAR)) {
            startIndex = buildMoneyList(DOLLAR, moneyList, money, startIndex);
        }
        // 角
        if (money.contains(DIME)) {
            startIndex = buildMoneyList(DIME, moneyList, money, startIndex);
        }
        // 分
        if (startIndex < money.length()) {
            moneyList.add(money.substring(startIndex));
        }
        return moneyList;
    }


    private static int buildMoneyList(String unit, List<String> moneyList, String money, int startIndex) {
        int endIndex = money.indexOf(unit) + 1;
        moneyList.add(money.substring(startIndex, endIndex));
        return endIndex;
    }

已有好多年没写过博文了,今天记录哈!!!!

相关推荐
Vic101013 分钟前
Spring AOP 常用注解完全指南
java·后端·spring
Halo_tjn3 分钟前
Java IO流实现文件操作知识点
java·开发语言·windows·算法
FL16238631299 分钟前
VTK源码编译时候选qt5路径
开发语言·qt
Felven9 分钟前
C. Maximum Median
c语言·开发语言·算法
CryptoRzz22 分钟前
StockTV API 对接全攻略(股票、期货、IPO)
java·javascript·git·web3·区块链·github
iReachers27 分钟前
为什么HTML打包安卓APP安装时会覆盖或者报错?
android·java·html·html打包apk·网页打包
纟 冬28 分钟前
Flutter & OpenHarmony 运动App运动模式选择组件开发
android·java·flutter
Wang's Blog31 分钟前
Lua: 基于协程的生产者-消费者模型实现
开发语言·lua
毕设源码-赖学姐41 分钟前
【开题答辩全过程】以 基于Springboot的智慧养老系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端