`
bruce198
  • 浏览: 233292 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

数字金额转大写

    博客分类:
  • java
阅读更多

public class ConverChMoney {
	private static final String[] CH_NUMBER = {"零","壹","贰","叁","四","五","六","七","八","镹"};//数组下标即为对应的大写数字
	private static final String[] LEVEL1 = {"","十","佰","仟"};
	private static final String[] LEVEL2 = {"","万","亿"};
	private static final String[] UNITS = {"元", "角", "分", "整"};   
	private static final String REGEX = "^(0|[1-9]\\d{0,11})(\\.(\\d\\d))?$";//金额正则表达式格式:123或123.00

	/**将数字金额:123456789转换为大写形式如:壹亿贰千叁百四十五万六千七百八十九元
	 * 金额格式:123或123.00
	 * 将数字金额按4位长度截取,分三级(千、万、亿),最多支持到亿
	 * 缺少金额格式正确性校验
	 * @param args
	 */
	public static void main(String[] args) {
		long startTime=System.currentTimeMillis();   //获取开始时间  
		//String money = "123456789";//壹亿贰千叁百四十五万六千七百八十九元
		String numMoney = "123456789.30";
		System.out.println("数字金额:" + numMoney);
		
		if(!numMoney.matches(REGEX)){
			System.err.println("输入金额错误!");
			System.exit(0);
		}
		String integerNum = "";//整数部分
		String fractionNum = "";//小数部分
		String chMoney = "";
		if(numMoney.indexOf(".") == -1){
			if(!integerNum.equals("0")){
				chMoney += converInteger(numMoney);//转换整数部分
			}
		}else{
			//有小数部分
			integerNum = numMoney.substring(0, numMoney.indexOf("."));
			fractionNum = numMoney.substring(numMoney.indexOf(".")+1);
			chMoney += converInteger(integerNum);//转换整数部分
			if (fractionNum.equals("00")) {   
				chMoney += UNITS[3]; // 添加“整”
			}else if(fractionNum.startsWith("0") && integerNum.equals("0")){
				// 如果整数部分为0,则去掉分前面的“零” 
				chMoney += convertFraction(fractionNum).substring(1);
			}else{
				chMoney += convertFraction(fractionNum);
			}
			integerNum = converInteger(integerNum);////转换整数部分
		}
		
		System.out.println("转换之后:" + chMoney);
		long endTime=System.currentTimeMillis(); //获取结束时间  
		System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
	}
	/**
	 * 转换金额小数部分
	 * @param fractionNum
	 * @return
	 */
	public static String convertFraction(String fractionNum){
		char jiao = fractionNum.charAt(0); // 角   
        char fen  = fractionNum.charAt(1); // 分   
        return (CH_NUMBER[jiao - '0'] + (jiao > '0' ? UNITS[1] : "")) + (fen > '0' ? CH_NUMBER[fen - '0'] + UNITS[2] : ""); 
		
	}
	/**
	 * 转换金额整数部分
	 * @param integerNum
	 * @return
	 */
	public static String converInteger(String integerNum){
		int numLen = integerNum.length();
		int remainder = numLen % 4;//余数
		int divNum = numLen / 4;//取整
		System.out.println("remainder:"+remainder+" divNum:"+divNum);
		StringBuilder chMoney = new StringBuilder("");//最终输出结果
		if(numLen <= 4){
			chMoney.append(convertNumRange(integerNum));
		}else{
			String range;//分割的数字段
			int startIndex = 0;
			int i;
			for(i = 0 ; i < divNum ; i++){
				//从右向左按4位长度依次截取
				startIndex = (numLen - 4)-(i*4);
				range = integerNum.substring(startIndex , numLen - (i*4));
				chMoney.insert(0, convertNumRange(range) + LEVEL2[i]);//加上金额级别("万","亿")
			}
			if(remainder != 0){
				range = integerNum.substring( 0, startIndex);
				chMoney.insert(0, convertNumRange(range) + LEVEL2[i]);//加上金额级别("万","亿")
			}
			
		}
		return chMoney.toString()+UNITS[0];
		
	}
	/**
	 * 转换小于、等于4( <=4) 的整数部分数字
	 * @param number
	 * @return
	 */
	public static String convertNumRange(String number){
		StringBuilder chineseMoney = new StringBuilder("");
		char numChar;
		int indexFromRight = 0;//从右边起开始的索引下标,下标为0表示个位数,1表示10位,2表示百位...
		int maxNumIndex = number.length() - 1;//数字最大下标(下表从0算起,所以为长度减1)
		for(int i = maxNumIndex ; i >= 0 ; i--){
			numChar = number.charAt(i);//将数字从右向左逐一取出
			if(numChar == '0'){
				// 当 numChar 是 0 且不为个位数且 numChar 的右边一位不是0时,插入“零” (避免出现“零零”)
				if(i < maxNumIndex && number.charAt(i + 1) != '0'){
					chineseMoney.append(CH_NUMBER[0]);
				}
			}else{
				chineseMoney.append(LEVEL1[indexFromRight]);//插入"十","佰","仟"
				chineseMoney.append(CH_NUMBER[numChar - '0']);//插入大写数字
			}
			indexFromRight++;//下标加1
		}
		return chineseMoney.reverse().toString();
	}

}
分享到:
评论
1 楼 bardo 2011-04-17  
建议看看这一个

http://bardo.iteye.com/blog/983559

相关推荐

Global site tag (gtag.js) - Google Analytics