• Java 中文数字转换为阿拉伯数字


    贴出代码,方便学习交流,稍后放出镜像问题的代码

    package com.thunisoft.cail.utils;
    
    import com.sun.istack.internal.NotNull;
    
    import java.security.InvalidParameterException;
    import java.util.*;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /**
     * @Author dengchengchao
     * @Time 2018/5/22
     * @Description 处理数字的工具类
     */
    public class DigitUtils {
        //读音与汉字对应的表
        private static final Map<Character, Integer> Arab2Chinese = new HashMap<Character, Integer>() {
            {
                put('零', 0);
                put('一', 1);
                put('二', 2);
                put('三', 3);
                put('四', 4);
                put('五', 5);
                put('六', 6);
                put('七', 7);
                put('八', 8);
                put('九', 9);
                put('十', 10);
    
            }
        };
    
        /**
         * 单位对应数量级的表
         */
        private static final Map<Character, Integer> UnitMap = new HashMap<Character, Integer>() {
            {
                put('十', 10);
                put('百', 100);
                put('千', 1000);
                put('万', 10000);
                put('亿', 10000 * 10000);
    
            }
        };
    
        //正则提取
        private static Pattern pattern = Pattern.compile("[零一二三四五六七八九十]?[十百千万亿]?");
    
    
    
        /**
         * 处理思路:
         * <p>
         * 可能的类型:
         * 一千三百万  130000000
         * 十一       11
         * 一万       10000
         * 一百二十五  125
         * <p>
         * 通过正则将字符串处理为 数字+单位的情况
         * 然后处理的时候通过数字*单位+数字*单位...得到最后结果
         *
         * @param chinese 汉字输入,比如一千三百二十八
         * @return 阿拉伯输入,比如 1328
         */
        @NotNull
        public static Integer Chinese2Arab(String chinese) {
    
            Objects.requireNonNull(chinese);
    
            //判断参数合法性
            if (!pattern.matcher(chinese).replaceAll("").trim().equals("")) {
                throw new InvalidParameterException();
            }
    
            Integer result = 0;
    
            Matcher matcher = pattern.matcher(chinese);
    
            //正则提取所有数字
            while (matcher.find()) {
                String res = matcher.group(0);
                if (res.length() == 2) {
                    result += Arab2Chinese.get(res.charAt(0)) * UnitMap.get(res.charAt(1));
                } else if (res.length() == 1) {
    
                    //处理三十、一百万的情况
                    if (UnitMap.containsKey(res.charAt(0))) {
                        result *= UnitMap.get(res.charAt(0));
                    } else if (Arab2Chinese.containsKey(res.charAt(0))) {
                        result += Arab2Chinese.get(res.charAt(0));
                    }
                }
            }
            return result;
        }
    
    }
    
    

    没怎么测试,有问题可以留言

  • 相关阅读:
    学习Oracle数据库入门到精通教程资料合集
    linux编程中printf显示不加换行的缓冲问题
    让 Terminal/vim 使用 Solarized 配色
    vim插件ctags的安装和使用
    rsync 同步文件
    try catch 场景
    关于浮点型的运算---比较
    mysql数据库死锁的产生原因及解决办法
    Laravel下载地址合集
    php垃圾回收机制
  • 原文地址:https://www.cnblogs.com/dengchengchao/p/9072840.html
Copyright © 2020-2023  润新知