0
点赞
收藏
分享

微信扫一扫

中文数字与阿拉伯数字转换

hoohack 2022-03-11 阅读 71
java算法
import java.util.Stack;

/**
 * 中文数字与阿拉伯数字转换
 */
public class CharacterToNum {
    public static final String UNITS = "十百千万亿";//单位
    public static final String NUMS = "零一二三四五六七八九";//数字
    public static void main(String[] args) {
        System.out.println(change("三千二百零一"));
    }

    public static long change(String cNum){
        
        int len = cNum.length();
        long sum = 0;
        long currentSum = 0;
        Stack<Integer> s = new Stack<>();//该栈存储当前数字
        Stack<Integer> s1 = new Stack<>();//该栈存储一次读取到的单位
        for (int i = 0; i < len; i++) {
            char tmp = cNum.charAt(i);
            int res = UNITS.indexOf(tmp);
            int res1 = NUMS.indexOf(tmp);
            if (res1 == 0)
                continue;
            if (res == -1){//说明是数字
                s.push(res1);
                if (!s1.empty() && s1.peek() == 0 
                || (i-1>=0 && NUMS.indexOf(cNum.charAt(i-1)) == 0)){
                		currentSum += (long)s.pop();
                }
            }
            else {//说明是单位,假如后面没有比他更大的单位了,才乘后加到sum中去
                s1.push(res);
                int ok = 0;
                //以下for循环用于判断后续还有没比当前单位更大的单位
                for (int j = i+1; j < len; j++) {
                    if (NUMS.indexOf(cNum.charAt(j)) != -1)
                        continue;
                    if (UNITS.indexOf(cNum.charAt(j)) > res){
                        ok = 1;//说明后面还有比他单位大的,此时不加到总和
                        break;
                    }
                }
                if (ok == 0){//加到总和
                    int num1 = 0;
                    //eg:3241,这一组数后面是没有比当前单位更大的,所以要判断currentSum是否为0
                    if (currentSum == 0)
                        num1 = s.pop();
                    switch (res){
                        case 0 : 
                        	sum += currentSum != 0 ? 
                        		currentSum * 10 : num1 * 10 ;break;
                        case 1 : 
                        	sum += currentSum != 0 ? 
                        		currentSum * 100 : num1 *100;break;
                        case 2 : sum += currentSum != 0 ? 
                        	currentSum * 1000 : num1 *1000;break;
                        case 3 : sum += currentSum != 0 ? 
                        	currentSum * 10000 : num1 * 10000;break;
                        case 4 : sum += currentSum != 0 ? 
                        	currentSum * 100000000 : num1 * 100000000 ;break;
                    }
                    currentSum = 0;//每计算完一次总和,需要将其归零
                }else {//加到临时总和
                    int num = s.pop();
                    switch (res){
                        case 0 : currentSum += (long) num * 10;break;
                        case 1 : currentSum += (long) num * 100;break;
                        case 2 : currentSum += (long) num * 1000;break;
                        case 3 : currentSum += (long) num * 10000;break;
                        case 4 : currentSum += (long) num * 100000000;break;
                    }
                }
            }
        }

				//最后的sum需要加上currentSum,eg:3241,最后的结果都存储在currentSum上
        return sum + currentSum;
    }
}

举报

相关推荐

0 条评论