汉字数字转化为阿拉伯数字

写毕设的时候用到百度语音,需要将识别到的汉字数字转化为阿拉伯数字,网上找了好多都不能准确转化。。集百家之所长总结了一个。

import java.util.Hashtable;

/**
 * 数字处理类
 *
 * @author yjx
 */

class DigitUtil {

    /**
     * 汉字中的数字字符
     */
    private static final Character[] SCDigits = {'零', '一', '二', '两', '三', '四',
            '五', '六', '七', '八', '九'};

    /**
     * 阿拉伯数字
     */
    private static final Character[] araDigits = {'0', '1', '2', '2', '3', '4',
            '5', '6', '7', '8', '9'};

    /**
     * 阿拉伯数字
     */
    private static Hashtable<Character, Character> araHash = new Hashtable<>();

    /**
     * 阿拉伯数字,十百千万亿
     */
    private static Hashtable<Character, Integer> YWQBSHash = new Hashtable<>();

    static {
        for (int i = 0; i < SCDigits.length; i++) {
            araHash.put(SCDigits[i], araDigits[i]);
        }
        YWQBSHash.put('亿', 100000000);
        YWQBSHash.put('万', 10000);
        YWQBSHash.put('千', 1000);
        YWQBSHash.put('百', 100);
        YWQBSHash.put('十', 10);
    }

    /**
     * @param remain  剩下多少个字符
     * @param curchar 当前分析的字符
     */
    private static int change(int num, Boolean bool, int no, int remain,
                             char curchar, char lastshow) {
        if (num == 0) {
            num += no;
            return num;
        } else {
            String numString = String.valueOf(num); // 将num转换成String
            String last = numString.substring(numString.length() - 1); // 获取最后一个字符
            String exceptlast = numString.substring(0, numString.length() - 1); // 获取除了最后一个字符所有字符串
            if (exceptlast.length() == 0) { // 说明num是个位值
                num = Integer.parseInt(last) * no;
                return num;
            } else {
                //针对有连续的这些字符[十百千万亿] start
                if (bool && YWQBSHash.get(curchar) > YWQBSHash.get(lastshow)) { // 说明上个字符属于[十百千万亿]
                    num *= no;
                    return num;
                }
                // 针对有连续的这些字符[十百千万亿] end

                // 分析到最后一个字符 start
                // 针对这种情况(一千二百二十一万)
                if (remain == 1 && YWQBSHash.get(curchar) > YWQBSHash.get(lastshow)) {
                    num *= YWQBSHash.get(curchar);
                    return num;
                }
                // 针对这种情况(一千二百二十一万)
                // 分析到最后一个字符 end

                // last如果为0 start
                if (last.equals("0")) { // 循环到最后一位字符,last等于0
                    last = "1"; //
                }
                // last如果为0 end

                exceptlast = exceptlast + "0"; // 缺少最后一位,需要补上
                num = Integer.parseInt(exceptlast) + Integer.parseInt(last)
                        * no;
                return num;
            }
        }
    }

    static int parse(String word) {
        int num = 0;
        char lastshow = '一'; // 上次出现的字符,字符特指[十百千万亿],默认随便填写一个'一'
        char[] ch = word.toCharArray();
        boolean bool = false; // 是否连续出现[十百千万亿]
        for (int i = 0; i < ch.length; i++) {
            Character find = araHash.get(ch[i]);// 获取阿拉伯数字数组[1,2,3...]
            if (find != null) {
                num += Integer.parseInt(String.valueOf(find.charValue()));
                bool = false;
            } else if (ch[i] == '十') {
                num = change(num, bool, 10, ch.length - i, ch[i], lastshow);
                bool = true;
                lastshow = '十';
            } else if (ch[i] == '千') {
                num = change(num, bool, 1000, ch.length - i, ch[i], lastshow);
                bool = true;
                lastshow = '千';
            } else if (ch[i] == '百') {
                num = change(num, bool, 100, ch.length - i, ch[i], lastshow);
                bool = true;
                lastshow = '百';
            } else if (ch[i] == '万') {
                num = change(num, bool, 10000, ch.length - i, ch[i], lastshow);
                bool = true;
                lastshow = '万';
            }
        }
        return num;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值