数值转换成大写金额运算

在记账时,我们经常用大写汉字代替数字进行记账,而我们在数值运算时往往是采用的阿拉伯数字进行的计算,这时我们就需要用到将阿拉伯数值转换成大写金额的数值转换工具,而这篇代码讲的就是这种数值换算运算.


它的大体思想是这样的

一、获取数字阿拉伯数值,假如说该数值是120000,那自然不用说了,如果是1.2 sw(十万),就应该首先将其转换成120000.

二、将该数值转换成大写金额,得到如下数值:壹拾万贰万零仟零佰零拾零

三、将该数值去掉万,得到:壹拾贰零仟零佰零拾零

四、补足丢失的万,得到:壹拾贰万零仟零佰零拾零

五、去掉多余的零,如果是去掉的位数为8-16位,则补上单位万,如果说去掉的位数大于16位,则补上亿,最后再加上圆整即可.


下面是其详细的代码:

package com.cnmoney;

public class CnMoney {
	
	public static String conversionCharToCnMoney(char s,int index){
		//s*1是利用自动转型,char乘以整数,可以将char类型转换成整形
		//该整形是利用ASCII码中的数值进行计算的,在ASCII码中,0对应十进制中的是48,1对应的是49,依此类推
		int number=s*1-48;
		String str="";
		switch(number){
		case 0:
			str="零";
			break;
		case 1:
			str="壹";
			break;
		case 2:
			str="贰";
			break;
		case 3:
			str="叁";
			break;
		case 4:
			str="肆";
			break;
		case 5:
			str="伍";
			break;
		case 6:
			str="陆";
			break;
		case 7:
			str="柒";
			break;
		case 8:
			str="捌";
			break;
		case 9:
			str="玖";
			break;
		}
		
		int unit=-1;
		
		if(index%4==0){
			unit=-1;          //个位(不做处理)
		}else if(index%4==1){
			unit=0;           //十位
		}else if(index%4==2){
			unit=1;           //百位
		}else if(index%4==3){
			unit=2;           //千位
		}
		
		//添加十位,百位,千位单位
		str+=getBigUnit(unit);
		if(index/4==0){
			unit=-1;          //不做处理
		}else if(index/4==1){
			unit=3;           //万位
		}else if(index/4==2){
			unit=4;           //亿位
		}
		
		str+=getBigUnit(unit);
		
		return str;
	}
	
	/**
	 * 取整
	 * @param str     大写金额
	 * @return
	 */
	public static String subStringUnit(String str){
		//截取多余的万和亿
		int strLength=str.length();
		int lastWan=str.lastIndexOf("万");
		if(lastWan!=-1){
			lastWan=strLength-lastWan;
			str=str.replace("万", "");
			strLength=str.length();
			str=str.substring(0,strLength-lastWan+1)+"万"+str.substring(strLength-lastWan+1, strLength);
			//重新获取剪短后的字符串数组的长度
			strLength=str.length();
			lastWan=str.lastIndexOf("亿");
			if(lastWan!=-1){
				lastWan=strLength-lastWan;
				str=str.replace("亿", "");
				strLength=str.length();
				str=str.substring(0, strLength-lastWan+1)+"亿"+str.substring(strLength-lastWan+1, strLength);
			}
		}
		boolean flag=true;
		strLength=str.length();
		int temp=0;
		for(int i=strLength;i>0;i--){
			if(i%2==1){
				if(str.substring(i-1,i).equals("零")){
					temp+=2;
				}else{
					flag=false;
					break;
				}
			}
		}
		
		if(temp!=0){
			if(!flag){
				//字符串分割
				str=str.substring(0, strLength-temp+1);
				if(temp>8&&temp<16){
					str+="万";
				}else if(temp>16){
					str+="亿";
				}
				str+="圆整";
			}
		}
		
		return str;
	}
	
	/**
	 * 获取大单位
	 * @param index
	 * @return
	 */
	public static String getBigUnit(int index){
		String str="";
		switch(index){
			case 0:
				str="拾";
				break;
			case 1:
				str="佰";
				break;
			case 2:
				str="仟";
				break;
			case 3:
				str="万";
				break;
			case 4:
				str="亿";
				break;
			case -1:
				str="";
				break;
		}
		return str;
	}
	
	/**
	 * 将数值型的数据转换成人民币大写数值
	 * @param money
	 * @return
	 */
	public static String conversionToCnMoney(Integer money){
		String moneyString=String.valueOf(money);
		int moneyLength=moneyString.length();
		String str="";
		for(int i=0;i<moneyLength;i++){
			char s=moneyString.charAt(i);
			str+=conversionCharToCnMoney(s,moneyLength-i-1);
		}
		//字符串截取
		str=subStringUnit(str);
		return str;
	}
	
	/**
	 * 将数值型的数据转换成人民币大写数值
	 * @return
	 */
	public static String conversionToCnMoney(Double money,String unit){
		long unitNumber=getUnitNumber(unit);
		long moneyLong=(long)(money*unitNumber);
		String moneyString=String.valueOf(moneyLong);
		int moneyLength=moneyString.length();
		String str="";
		for(int i=0;i<moneyLength;i++){
			char s=moneyString.charAt(i);
			str+=conversionCharToCnMoney(s,moneyLength-i-1);
		}
		//字符串截取
		str=subStringUnit(str);
		return str;
	}
	
	/**
	 * 获取单位数值
	 * @param unit
	 * @return
	 */
	public static long getUnitNumber(String unit){
		long unitNumber=0L;
		switch(unit){
			case "s":
				unitNumber=10L;
				break;
			case "b":
				unitNumber=100L;
				break;
			case "q":
				unitNumber=1000L;
				break;
			case "w":
				unitNumber=10000L;
				break;
			case "sw":
				unitNumber=100000L;
				break;
			case "bw":
				unitNumber=1000000L;
				break;
			case "qw":
				unitNumber=10000000L;
				break;
			case "y":
				unitNumber=100000000L;
				break;
			case "sy":
				unitNumber=1000000000L;
				break;
			case "by":
				unitNumber=10000000000L;
				break;
			case "qy":
				unitNumber=100000000000L;
				break;
			case "wy":
				unitNumber=1000000000000L;
				break;
		}
		return unitNumber;
	}
	
	public static void main(String[] args) {
		
		int money=120000;
		String str=conversionToCnMoney(money);
		System.out.println(str);
		
		money=12;
		str=conversionToCnMoney(money);
		System.out.println(str);
		
		Double money2=3.14;
		String unit="by";
		
		str=conversionToCnMoney(money2,unit);
		System.out.println(str);

	}

}


运行的结果:

壹拾贰万圆整
壹拾贰
叁佰壹拾肆亿圆整



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值