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

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

相关推荐
2601_966949653 小时前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
晨曦中的暮雨5 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
喵了几个咪6 小时前
GoWind CMS 拆解:在 Go 里给 TipTap 搭一套 Yjs 协同后端
开发语言·后端·golang
程序员清风6 小时前
数据处理脚本工程化:日志、配置、命令行与测试
服务器·开发语言·数据库
文丑颜不良啊7 小时前
LeetCode876~900题目解析
java·leetcode
aloha_7897 小时前
Java 基础、集合、异常与 JUnit 5 速查
java·junit·sqlserver
知守观8 小时前
设计模式实战:从真实老项目中看标准模板方法与工厂的落地
java·spring·设计模式
2601_962885728 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
独隅8 小时前
Claude API 实战教程:从入门到完整项目
android·java·数据库·claude·claude code
Wang's Blog8 小时前
Java 项目实战: 交友项目 - 圈子功能实现:总结
java·开发语言·交友