在记账时,我们经常用大写汉字代替数字进行记账,而我们在数值运算时往往是采用的阿拉伯数字进行的计算,这时我们就需要用到将阿拉伯数值转换成大写金额的数值转换工具,而这篇代码讲的就是这种数值换算运算.
它的大体思想是这样的
一、获取数字阿拉伯数值,假如说该数值是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);
}
}
运行的结果:
壹拾贰万圆整
壹拾贰
叁佰壹拾肆亿圆整