中文和阿拉伯数字互转

该博客分享了可在项目中直接使用的Java代码,用于实现中文数字和阿拉伯数字的互转。博主认为网上相关代码不够精简,故自行实现并分享,还表示若有疑问或发现BUG可评论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可在项目中直接使用 Java实现中文数字和阿拉伯数字互转

网上看到一些中文数字互转的代码,感觉写得不是很精简,特意自己实现并分享一下。
如果有疑问或者发现BUG,可以随时评论。

中文转阿拉伯数字

    private final Map<Character, Long> UNIT = new LinkedHashMap() {
        {
            put('亿', 100000000l);
            put('万', 10000l);
            put('千', 1000l);
            put('百', 100l);
            put('十', 10l);
        }
    };
    private final Map<Character, Long> NUMBER = new HashMap() {
        {
            put('零', 0l);
            put('一', 1l);
            put('二', 2l);
            put('三', 3l);
            put('四', 4l);
            put('五', 5l);
            put('六', 6l);
            put('七', 7l);
            put('八', 8l);
            put('九', 9l);
        }
    };
    public long words2Number(String words) {
        if (words.length() == 0) return 0;
        int index;
        for (Map.Entry<Character, Long> m : UNIT.entrySet()) {
            index = words.indexOf(m.getKey());
            if (index != -1) 
            //防止index=0会产生'十'情况不对
            return (index == 0 ? 1 : words2Number(words.substring(0, index))) * (m.getValue())
                    + words2Number(words.substring(index + 1, words.length()));
        }
        return NUMBER.get(words.charAt(words.length() - 1));
    }

阿拉伯数字转中文

    private final Map<Integer, Character> UNIT = new LinkedHashMap() {
        {
            put(100000000, '亿');
            put(10000, '万');
            put(1000, '千');
            put(100, '百');
            put(10, '十');
        }
    };
    private final String[] NUMBER = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
    private boolean FLAG;

    public String number2Words(long num) {
        //变量是为了考虑"一十" 和 "一千零一十"  这一类不同情况下'十'的叫法问题,首字段出现'十'需要移除前面的'一'
        FLAG = false;
        return helper(num);
    }

    public String helper(long num) {
        if (num == 0) return NUMBER[(int) num];
        StringBuffer sb = new StringBuffer();
        for (Map.Entry<Integer, Character> m : UNIT.entrySet()) {
            int key = m.getKey();
            //考虑数字是不是比这个单位大
            if (num / key >= 1) {
                long remainder = num % key;
                //防止出现"一十" "一十万"等这种情况
                if (!(remainder == 0 && num == key && key == 10 && !FLAG))
                    //添加前面大的部分
                    sb.append(helper(num / key));
                FLAG = true;
                sb.append(m.getValue());
                //余数是不是等于0
                if (remainder != 0) {
                    //当中间存在0时需要补上'零'
                    if (remainder * 10 < key) sb.append(NUMBER[0]);
                    //添加后面小的部分
                    sb.append(helper(remainder));
                }
                return sb.toString();
            }
        }
        return NUMBER[(int) num];
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值