汉语数字或罗马数字转化为阿拉伯数字:例如:一百二十三为123、III为3

方式一:得到结果集然后进行遍历

public static void main(String[] args) {
		List<String> kk = new ArrayList<String>();
		kk.add("一");
		kk.add("五");
		kk.add("一十三");
		kk.add("十");  
		kk.add("十三");
		kk.add("二百");
		kk.add("一百五");
		kk.add("一百五十");
		kk.add("一千五");
		kk.add("一千五百");
		kk.add("一万零五百");
		kk.add("一万五");
		kk.add("一万五千");//
		kk.add("一万零五十");
		kk.add("一万零五");
		kk.add("一千零五");
		kk.add("九千九百九十九");
		for (String str : kk) {
			String oo = initNumToInt(str);
			System.out.println(str+ ":"+oo);
			System.err.println(str+ ":"+dsd.chineseToInt(str));
		}	
	}
	public static String initNumToInt(String str) {
		char chinaNum[] = {'一','二','三','四','五','六','七','八','九','十'};
		int matheNum[] = {1,2,3,4,5,6,7,8,9,0};
		String chinaNumUnit[] = {"零","十","百","千","万"};
		int moveNum[] = {0,1,2,3,4};
		for(int i=0;i<chinaNumUnit.length;i++) {  //初始化str
			if(str.startsWith(chinaNumUnit[i])) {
				str = "一"+str;
				break;
			}else if(str.length()>2&&i>1 ){
				if(chinaNumUnit[i].equals(String.valueOf(str.charAt(str.length()-2)))) {
					str = str+chinaNumUnit[i-1];
					break;
				}
			}
		}
		List<Integer> list = new ArrayList<Integer>();
		char cha = '0';		
		int result = 0;
			for(int i=0;i<str.length();i++) {
				cha = str.charAt(i);//
				ok:for(int j=0;j<chinaNum.length;j++) {
					if(cha==chinaNum[j]) {
						int num = matheNum[j];
						if(list.size()==0) {
							list.add(num);	
						}else {
							list.set(0, num);
						}										
					}
					//移动
					if(list.size()!=0) {
							for(int k=0;k<chinaNumUnit.length;k++) {				
							if(cha==chinaNumUnit[k].charAt(0)) {
								int a = list.size();
								if(a<=moveNum[k]) {
									for(int size=0;size<moveNum[k];size++) {
										list.add(0);
									}
								}		
								list.set(moveNum[k], list.get(0));
								list.set(0, 0);
								break ok;
							}else {
								continue;
							}
						}
					}
				}	
			}
		for(int i=0;i<list.size();i++) {//遍历方式一
			int multiple=1;
			for(int k=1;k<=i;k++) {
				multiple = multiple * 10;
			}
			result += list.get(i)*multiple;
		}
		String newStr="";
			for(int i=0;i<list.size();i++) {//遍历方式二
				newStr +=list.get(list.size()-1-i);
			}
				return result+"";
	 }
运行结果展示

结果展示
以上方式暂时无法处理十万以上的数字

方式二:结果集一直变化中

public class Dsd {
	 public static int chineseToInt(String str) {
			 Map<Character,Integer> map = new HashMap<>();
			 map.put('一', 1);
			 map.put('二', 2);
			 map.put('三', 3);
			 map.put('四', 4);
			 map.put('五', 5);
			 map.put('六', 6);
			 map.put('七', 7);
			 map.put('八', 8);
			 map.put('九', 9);
			 map.put('十', 10);
			 map.put('百', 100);
			 map.put('千', 1000);
			 map.put('万', 10000);
			 str = str.replaceAll("零", "");
			 int[] nums = new int[str.length()+1];
			 int nm = 0;
			 for(int i = 0;i<str.length();i++) {
				 nums[i] = map.get(str.charAt(i));
				 if(i!=0&&nums[i]>=10) {
					 if(nums[i-1]<10){
						 nm += nums[i]*nums[i-1]-nums[i-1];
					 }else {
						 nm *= nums[i];
					 }
				 }else {
					 nm += nums[i];
				 }
			 }
			 return nm;
		 }
}
运行结果展示

展示2
以上方式暂时处理结果,克服了第一种方式的短板

方式二在结果上出现了一部分的误差,只需在调用方法之前调用初始化str的方法即可

罗马数字转化为阿拉伯数字

	 public static void main(String[] args) {
		 List<String> kk = new ArrayList<String>();
			kk.add("III");//3
			kk.add("IX");//9
			kk.add("XXIX");//29
			kk.add("XI");  //11
			kk.add("CMXCIX");//999
			kk.add("MDCCCXCIX");//1899
			kk.add("MDCLXVI");//1666
			kk.add("C");//100
			kk.add("LX");//60
			kk.add("XCVIII");//98
		for (String str : kk) {
		 System.out.println(str+":"+romanToInt(str));
		}
	 }
	 
	 public static int romanToInt(String s) {
		 int nm = 0;
		 int[] nums = new int[s.length()+1];
		 char[] cs = s.toCharArray();
		 for(int i = 1;i<=cs.length;i++) {
			 switch (cs[cs.length-i]) {
			case 'I':
				nums[i] = 1;
				break;
			case 'V':
				nums[i] = 5;
				break;
			case 'X':
				nums[i] = 10;
				break;
			case 'L':
				nums[i] = 50;
				break;
			case 'C':
				nums[i] = 100;
				break;
			case 'D':
				nums[i] = 500;
				break;
			default:
				nums[i] = 1000;
				break;
			}
			 if(nums[i]>=nums[i-1]) {
				 nm += nums[i];
			 }else {
				 nm -= nums[i];
			 }
		 }
		 return nm;
	    }
运行结果展示

展示3
有出入的地方欢迎指正,有好的方案欢迎交流,代码中有很多不足的地方还望见谅

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值