`
hsys
  • 浏览: 286332 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

递归实现会计金额大小写转换

    博客分类:
  • Java
J# 
阅读更多

import java.text.DecimalFormat;
import java.text.NumberFormat;


public class MoneyUtils {
	/**
	 * 中文中繁写的汉字金额 经常使用
	 */
	public static String[] upperNums = new String[] { "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖", "零","整","正" };
	/**
	 * 与汉字相应的转化的数字
	 */
	public static int[] lowerNums = new int[] { 1, 2, 3, 4, 5, 6, 7,8, 9,  0 ,0,0};
	/**
	 * 倍数关键词 简写 注意:一定要由大到小
	 */
	public static String[] rmbMult = new String[] { "亿", "万", "仟", "佰", "拾","元","圆","整","正","角","分" };
	/**
	 * 与倍数关键词对应的倍数
	 */
	public static double[] toMult = new double[] { 100000000, 10000, 1000, 100,10,1,1,1,1,0.1,0.01 };
	
	public static String negative = "(负数)";
	
	public static double toLower(String amountInWords){
		int ispositive = 1;
		if(amountInWords.indexOf(negative)>=0){
			ispositive = -1;
			amountInWords = amountInWords.replace(negative, "");
		}
		double amountInFigures = 0;
		if(amountInWords.length() == 1){
			return getLowerNum(amountInWords);
		}
		else if(amountInWords.length() == 2 && amountInWords.substring(0,1).equals(upperNums[9])){
			return getLowerNum(amountInWords.substring(1,2));
		}else{
			for (int i = 0; i < rmbMult.length; i++) {
				int index = amountInWords.lastIndexOf(rmbMult[i]);
				if (index >= 0) {
					String storeMult = amountInWords.substring(0, index);
					amountInWords = amountInWords.substring(index + 1);
					amountInFigures = toLower(storeMult)*toMult[i] + toLower(amountInWords);
					break;
				}
			}
		}
		return amountInFigures*ispositive;
	}
	
	private static double getLowerNum(String upperNum){
		for (int j = 0; j < upperNums.length; j++) {
			if(upperNum.equals(upperNums[j])){
				return lowerNums[j];
			}
		}
		return 0;
	}
	
	public static String toUpper(String amountInFiguresStr){
		String amountInWords = "";
		String integerPart = amountInFiguresStr;
		String decimalPart = "";
		int indexOfDot = amountInFiguresStr.indexOf('.');
		if(indexOfDot >= 0){
			integerPart = amountInFiguresStr.substring(0,indexOfDot);
			if(amountInFiguresStr.length() - 1 > indexOfDot){
				decimalPart = amountInFiguresStr.substring(indexOfDot+1);
			}
		}
		double tempPrice = 0;
		try {
			tempPrice = Double.parseDouble(amountInFiguresStr);
		} catch (NumberFormatException e) {
			tempPrice = 0;
		}
		if(tempPrice == 0){ //如果输入的是0或者无法转成double时,设为0 
			amountInWords = upperNums[9]; //零 
		}else{
			if(!integerPart.equals("")){
				long integerNum = Long.parseLong(integerPart);
				if(tempPrice < 0){
					amountInWords = negative;
				}
				if(integerNum != 0){
					amountInWords += intToUpper(Math.abs(integerNum));
					amountInWords +=  rmbMult[5]; //元
				}
			}
			if(decimalPart.equals("") || Integer.parseInt(decimalPart) == 0){
				amountInWords += rmbMult[7]; //整  
			}else{
				amountInWords += getUpperNum(Integer.parseInt(decimalPart.substring(0,1)));
				if(!decimalPart.substring(0,1).equals("0")){
					amountInWords +=  rmbMult[9]; //角
				}
				if(decimalPart.length() > 1 && !decimalPart.substring(1,2).equals("0")){
					amountInWords += getUpperNum(Integer.parseInt(decimalPart.substring(1,2))) + rmbMult[10]; //分
				}
			}
		}
		return amountInWords;
	}
	
	private static String intToUpper(long amountInFigures){
		if(amountInFigures == 0){
			return "";
		}
		else if(amountInFigures < 10){
			return getUpperNum((int)amountInFigures);
		}else{
			String amountInWords = "";
			for(int i=0;i<toMult.length - 2;i++){
				int divisor =(int)(amountInFigures / (long)toMult[i]);
				long mod = amountInFigures % (long)toMult[i];
				if(divisor > 0){
					amountInWords += intToUpper(divisor) + rmbMult[i];
					if(0 < mod && mod < (long)toMult[i]/10){
						amountInWords += upperNums[9];
					}
					amountInWords +=  intToUpper(mod);
					break;
				}
			}
			return amountInWords;
		}
	}
	
	private static String getUpperNum(int lowerNum){
		for(int i=0;i<lowerNums.length;i++){
			if(lowerNum == lowerNums[i]){
				return upperNums[i];
			}
		}
		return upperNums[9]; //零 
	}
	
	public static void main(String[] args){
		String amountInFiguresStr = "-124500002.43";
		String amountInWords = toUpper(amountInFiguresStr);
		System.out.println(amountInWords);
		double amountInFigures = toLower(amountInWords);
		NumberFormat formatter = new DecimalFormat("0.00");
		System.out.println(formatter.format(amountInFigures));
	}
}




如果有错误,希望大家能够给我指出来,谢谢
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics