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;
    }

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

相关推荐
http阿拉丁神猫4 小时前
Go语言入门笔记:从基础到开发环境搭建(二)
开发语言·笔记·golang
不会就选b5 小时前
C++补充部分(一)--lambda 表达式
开发语言·c++
Pniubi8 小时前
HashMap的扩容和树化边界
java·开发语言
Mikko78 小时前
用 Java 复刻了高中时在塞班上玩的「熔岩矿车」:纯 Swing、零依赖、没有一张图片,一个 jar 双击就能玩
java·游戏开发·swing
知了学历孙老师8 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
Java爱好狂.8 小时前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
秋饼9 小时前
LLM API密钥动态轮换实战:Spring Vault + Spring AI + 多Provider路由
java·ai·技术分享·后端开发
gCode Teacher 格码致知9 小时前
Pandas教学-17:Series与Dataframe的关系
开发语言·python·pandas
发量惊人的中年网工9 小时前
分公司访问总部ERP慢怎么办?SD-WAN组网的排查与验收要点
服务器·开发语言·php
下页、再停留10 小时前
【C#桌面客户端系列学习-15】生成可视化图表之折线图、柱状图、饼状图
开发语言·c#