zoukankan      html  css  js  c++  java
  • 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;
        }
    
    }
    
    

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

  • 相关阅读:
    mysql 性能监控
    拼接字符
    mysql 存储 2
    mysql 存储过程
    flock
    readfile() file_get_content f
    url_encode和base64
    jsdetox反混淆js内容,解密前端加密参数
    前端加密之使用firefox来解密
    v to ray做渗透测试
  • 原文地址:https://www.cnblogs.com/dengchengchao/p/9072840.html
Copyright © 2011-2022 走看看