人民币转换数字

       该贴原因:

       今日有幸看到uuwatch面试题:大概意思就是将日常中人民币的大写转换成阿拉伯数字表示,不记小数点,同时需要考虑效率,因为该方法需要执行100万次。

       1、实现该代码(代码效率可能欠佳,望看到的同仁提出更高效率的算法)

 

 

     

 

package wzf.learn.excelDemo1.test;

import java.util.HashMap;
import java.util.Map;

public class RMB2Num {

	private static Map<String,String> chineseMap = new HashMap<String,String>();
	
	static {
		chineseMap.put("壹", "1");
		chineseMap.put("贰", "2");
		chineseMap.put("叁", "3");
		chineseMap.put("肆", "4");
		chineseMap.put("伍", "5");
		chineseMap.put("陆", "6");
		chineseMap.put("柒", "7");
		chineseMap.put("捌", "8");
		chineseMap.put("玖", "9");
		chineseMap.put("零", "");
		chineseMap.put("亿", "100000000");
		chineseMap.put("万", "10000");
		chineseMap.put("仟", "1000");
		chineseMap.put("佰", "100");
		chineseMap.put("拾", "10");
		chineseMap.put("圆", "");
		chineseMap.put("整", "");
		
	}
	public long change1(String rmb){
		long retStr = 0L ;
		
		//先看里面是否包含亿
		if(rmb.contains("亿")){
			retStr = retStr + yi(rmb.substring(0, rmb.indexOf("亿"))) * Long.valueOf(chineseMap.get("亿"));
		}
		
		先看里面是否包含万
		int indexwan = 0;
		rmb = rmb.substring(0, rmb.indexOf("亿"));
		if(rmb.contains("万")){
			indexwan = rmb.indexOf("万");
			retStr = retStr + wan(rmb.substring(1, rmb.indexOf("万"))) * Long.valueOf(chineseMap.get("万"));
		}
		//截取万后面的
		
		retStr = retStr + qian(rmb.substring(indexwan+1, rmb.length() ));
		
		return retStr;
	}
	
	
	public long yi(String yi){
		long ret = 0l;
		
		int indexwan = 0;
		if(yi.contains("万")){
			indexwan =yi.indexOf("万");
			ret = ret + wan(yi.substring(1, yi.indexOf("万"))) * Long.valueOf(chineseMap.get("万"));
		}
		ret = ret + qian(yi.substring(indexwan+1, yi.length()));
		return ret;
	}
	
	public long wan(String wan){
		return qian(wan.substring(0, wan.length()));
	}
	
	//万以后的
	public long qian(String qian){
		long retStr = 0l;
		String segument = "";
		for (int i = 0; i < qian.length(); i++) {
			String temp = qian.substring(i,i+1);
			if("仟".equalsIgnoreCase(temp)){
				retStr = retStr + Long.valueOf(segument.equals("")?"1":segument)*Long.valueOf(chineseMap.get(temp)) ;
				segument = "";
			}else if("佰".equalsIgnoreCase(temp)){
				retStr = retStr + Long.valueOf(segument.equals("")?"1":segument)*Long.valueOf(chineseMap.get(temp)) ;
				segument = "";
			}else if("拾".equalsIgnoreCase(temp)){
				retStr = retStr + Long.valueOf(segument.equals("")?"1":segument)*Long.valueOf(chineseMap.get(temp)) ;
				segument = "";
			}else{
				segument = segument + chineseMap.get(temp);
			}
		}
		if(segument.length() > 0){
			retStr = retStr + Long.valueOf(segument);
		}
		return retStr;
	}
	
	public static void main(String[] args) {
		RMB2Num rmb = new RMB2Num();
		
		System.out.println(rmb.qian("壹仟零叁圆整"));
		System.out.println(rmb.change1("壹佰万零叁拾亿柒仟捌佰零玖万壹仟零叁圆整"));
	}

	
}

 

  2、需要写三个测试用例      

 

   3、写出测试用例的关键点

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值