/**
定义一个常用的工具函数:需将一个浮点数转换成人民币读法字符串。
思路:1、现将这个浮点数转换为整数部分和小数部分并存入字符串数组中。
2、分别对整数和小数部分进行转换。
3、将转换后的两部分字符串连接在一起。
@author 小田
@version 1.0
*/
public class Rmb
{
private String [] p={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
private String [] p1={"拾","佰","仟"};
/**
* 把一个浮点数分成整数部分和小数部分
* @param x 需要分解的浮点数
* @return 分解出来的整数部分和小数部分,字符串数组的第一个元素是整数不封,第二个元素是小数部分
* */
private String [] stringArray(double x)
{
long zheng=(long)x;//将浮点数强制类型转换,获得整数部分
long xiao=Math.round((x-zheng)*100);//通过Math类的静态方法获得浮点数的小数部分。
return new String []{zheng+"",String.valueOf(xiao)};//将整数部分和小数部分都以字符串形式存入字符串数组
}
/**
* 将一个浮点数转换成人民币读法字符串
* @param x 需要转换的浮点数
* @return 转换后的人民币读法字符串
* */
public String zhuanHuan(double x)
{
String [] m=stringArray(x);//将浮点数拆分为整数部分和小数部分
String zheng1=m[0];//将获得的整数部分赋给字符串变量zheng1
String xiao1=m[1];//将获得的小数部分赋给字符串变量xiao1
String rmbxiao=xiaoZhuan(xiao1);//获取小数部分的人民币读法字符串
String rmbzheng=zhengZhuan(zheng1);//获取整数部分的人民币读法字符串
return rmbzheng+rmbxiao;//返回整个浮点数字的人民币读法字符串
}
/**
* 将小数部转化为人民币读法字符串
* @param xiao1 需要转化的小数部分
* @return 转换后的人民币读法字符串
* */
private String xiaoZhuan(String xiao1)
{
String result;//定义一个字符串来记录小数部分的人民币读法
if (xiao1.length()>1)//如果小数部分字符串长度大于1,则小数的有效位为两个
{
if(xiao1.charAt(0)-48==0)//判断角位是否为零
{
if (xiao1.charAt(1)-48==0)//判断分位是否为零
{
result="零角零分";//当角位和分位同时为零时,记录人民币读法为"零角零分"
}
else
{
result=p[xiao1.charAt(1)-48]+"分";//当角位为零,分位不为零时,记录人民币读法
}
}
else
{
if (xiao1.charAt(1)-48==0)
{
result=p[xiao1.charAt(0)-48]+"角";//当角位不为零,分位为零时,记录人民币读法
}
else
{
result=p[xiao1.charAt(0)-48]+"角"+p[xiao1.charAt(1)-48]+"分";//当角位和分位同时不为零时,记录人民币读法
}
}
}
else
result=p[xiao1.charAt(0)-48]+"分";//小数部分的字符串长度为1时,记录人民币读法。
return result;
}
private String firstPanDuan(String str)
{
String result="";
result+=p[str.charAt(0)-48]+p1[str.length()-2];
for (int x=1 ;x<str.length() ;x++ )
{
int num1=str.charAt(x)-48;
if (num1!=0&&x!=str.length()-1)
{
result+=p[num1]+p1[str.length()-2-x];
}
else
{
if (x>=2)
{
if (str.charAt(x-1)-48==0&&str.charAt(x)-48==0)
continue;
}
else
{
if (str.charAt(str.length()-1)-48==0)
continue;
}
}
}
return result;
}
private String lastPanDuan(String str2)
{
String result="";
if(str2.charAt(0)-48!=0)
result+=p[str2.charAt(0)-48]+p1[str2.length()-2];
for (int x=1 ;x<str2.length() ;x++ )
{
int num3=str2.charAt(x)-48;
if (num3!=0&&x!=str2.length()-1)
{
result+=p[num3]+p1[str2.length()-2-x];
}
else
{
if (x>=2)
{
if (str2.charAt(x-1)-48==0&&str2.charAt(x)-48==0)
continue;
}
else
{
if (str2.charAt(str2.length()-1)-48==0)
continue;
}
result+=p[num3];
}
}
return result;
}
/**
* 将整数部分转换为人民币读法的字符串
* @param zheng1 需要转换的整数部分
* @return 转换后的整数部分人民币读法字符串。
* */
private String zhengZhuan(String zheng1)
{
String result="";
if (zheng1.length()>8&&zheng1.length()<13)//如果浮点数的整数部分长度大于8,小于13,则读法分位三个部分:xx亿xx万xx元
{
String str=zheng1.substring(0,zheng1.length()-8);//取出第一部分,xx亿进行人民币读法的转换
result=firstPanDuan(str);
result+="亿";
String str1=zheng1.substring(zheng1.length()-8,zheng1.length()-4);//取出第二部分xx万,进行人民币读法的转换
if(str1.charAt(0)-48!=0)//第二部分最高位为零则不读
result+=p[str1.charAt(0)-48]+p1[str1.length()-2];
for (int x=1 ;x<str1.length() ;x++ )//从第二位开始转换
{
int num2=str1.charAt(x)-48;
if (num2!=0&&x!=str1.length()-1)
{
result+=p[num2]+p1[str1.length()-2-x];
}
else
{
if (x>=2)
{
if (str1.charAt(x-1)-48==0&&str1.charAt(x)-48==0)//若连续两个零,也不读
continue;
}
else
{
if (str1.charAt(str1.length()-1)-48==0)//第二部分最低位为零,也不读
continue;
}
result+=p[num2];//将不是零的最低位读出
}
}
if(str1.charAt(0)-48!=0||str1.charAt(1)-48!=0||str1.charAt(2)-48!=0||str1.charAt(3)-48!=0)
result+="万";//第二部分不全为零,则万第二部分加上“万”
String str2=zheng1.substring(zheng1.length()-4,zheng1.length());//取出第三部分,xx元
result+=lastPanDuan(str2);
result+="元";
}
else if (zheng1.length()>4&&zheng1.length()<9)//当整数部分的字符串长度为4-9时
{
String str1=zheng1.substring(0,zheng1.length()-4);
result=firstPanDuan(str1);
result+="万";
String str2=zheng1.substring(zheng1.length()-4,zheng1.length());
result+=lastPanDuan(str2);
result+="元";
}
else if (zheng1.length()>0&&zheng1.length()<5)//当整数部分的字符串长度为1-4时
{
String str2=zheng1.substring(0,zheng1.length());
result=firstPanDuan(str2);
result+="元";
}
return result;
}
public static void main (String [] args)
{
Rmb rb=new Rmb();
System.out.println(rb.zhuanHuan(1000000304.02));
}
}
|
|