疯狂Java讲义课后题4.5 将浮点数转换成人民币读法字符串
前提假设:整数部分最多12位,小数部分最多2位
思路:
- 输入数据后首先将小数部分与整数部分分开
- 对于整数部分,首先需要把前四位,中间四位,最后四位分开,分别加”亿“,”万“,”元“单位。还需要考虑几种零存在的情况:1)中间有连零,如1001,只需要读一个零;2)后面有连零,如1000,零不需要读出来。
- 对于小数部分,只包含”角“和”分“两位。如果没有小数部分,则整个小数部分都不需要读出来。如果有,则有”几角几分“,”几角“以及”零几分“三种读法。
import java.util.*;
public class u4s5
{
private String[] UnitArr = {"千","百","十"};
private String[] ChineseArr = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖","拾"};
public String NumStr2ChineseStr(double a)
{
if (a==0) //若a=0,直接返回“零元”
{
return "零元";
}
long IntPart = (long)a; //将整数部分提取出来
long FloatPart = Math.round((a-IntPart)*100); //将小数部分提取出来
String intStr = String.valueOf(IntPart); //将整数部分转化为字符串形式
String floatStr = String.valueOf(FloatPart); //将小数部分转化为字符串形式
return NumStr2ChineseStr_IntPart(intStr)+NumStr2ChineseStr_FloatPart(floatStr);
}
/*四位数的字符串转汉字读法
*/
public String NumStr2ChineseStr_IntPartCore(String NumStr)
{
String rst = "";
int len = NumStr.length();
if(len<4) //如果长度小于4,则向前补零
{
String[] AddZeroStr = {"0","00","000"};
NumStr = AddZeroStr[4-len-1]+NumStr; //两个字符串想要合起来直接使用”+“即可
}
len = NumStr.length(); //其实len==4
//扫描至第一个不为零的字符
int i = 0;
while(i < len && NumStr.charAt(i)-'0' == 0)
i++;
if(i == len) //如果四位都为零,则直接返回零
{
rst += "零";
return rst;
}
for(;i < len;i++)
{
int num = NumStr.charAt(i)-'0';
if(i != len-1&&num != 0) //不是末尾且不是0
{
rst += ChineseArr[num] + UnitArr[i];
}
else if(i == len-1 && num != 0) //是末尾但不是零,不加单位直接将数字转化为汉字即可
{
rst += ChineseArr[num];
}
else if(i !=len-1 && num ==0) //不是末尾但是零,需要考虑是否出现连零的情况
{
if(NumStr.charAt(i-1)-'0' != 0)
{
rst += "零";
}
}
}
return rst;
}
/*将12位整数部分数字转化为汉字字符
*/
public String NumStr2ChineseStr_IntPart(String NumStr)
{
int len = NumStr.length();
int partNum = (len%4==0)?(len/4):(len/4)+1;
String Str_yi="",Str_wan="",Str_yuan="";
String FirstStr,SecondStr,ThirdStr;
int tmp_len;
boolean FourValidBit_yuan =false;
switch(partNum)
{
case 1: //只有1部分,就是xxx元
{
Str_yuan += NumStr2ChineseStr_IntPartCore(NumStr);
break;
}
case 2: //有2部分,xxx万xxx元
{
int endindex = len-4;
FirstStr = NumStr.substring(0,endindex);
Str_wan += NumStr2ChineseStr_IntPartCore(FirstStr)+"万";
SecondStr = NumStr.substring(endindex,len);
Str_yuan += NumStr2ChineseStr_IntPartCore(SecondStr);
tmp_len = GetVaildStrLen(SecondStr);
if(0 < tmp_len && tmp_len < 4)
Str_yuan = "零" + Str_yuan;
break;
}
case 3: //有3部分,xxx亿xxx万xxx元
{
int endindex2 = len - 4;
int endindex1 = endindex2 - 4;
FirstStr = NumStr.substring(0,endindex1);
Str_yi += NumStr2ChineseStr_IntPartCore(FirstStr)+"亿";
SecondStr = NumStr.substring(endindex1,endindex2);
Str_wan += NumStr2ChineseStr_IntPartCore(SecondStr)+"万";
tmp_len = GetVaildStrLen(SecondStr);
if (0 < tmp_len && tmp_len < 4)
Str_wan = "零" + Str_wan;
ThirdStr = NumStr.substring(endindex2,len);
Str_yuan += NumStr2ChineseStr_IntPartCore(ThirdStr);
tmp_len = GetVaildStrLen(ThirdStr);
if(0 < tmp_len && tmp_len < 4)
Str_yuan = "零" + Str_yuan;
else
{
if( tmp_len ==4)
FourValidBit_yuan=true;
}
break;
}
}
if(Str_wan.equals("零万")) //如果xxx万部分为零,且xxx元部分不为零,则直接读”零“,不加”万";若两部分都为零,直接不用读
{
if(FourValidBit_yuan)
Str_wan = "零";
else
Str_wan = "";
}
if(Str_yuan.equals("零")) //如果只是xxx元部分为零,则这部分不读
Str_yuan="";
return Str_yi+Str_wan+Str_yuan+"元";
}
/*获取数字字符串不是零的位数
*/
public int GetVaildStrLen(String str)
{
int start = 0;
int len = str.length();
while(start < len && str.charAt(start) == '0')
++ start;
return 4-start;
}
public String NumStr2ChineseStr_FloatPart(String floatStr)
{
String rst_jiao = "",rst_fen = "";
int len = floatStr.length();
if(len < 2) //若小数部分不够两位则向前补零,为了处理“角”位为零,“分”位不为零和两位都为零的情况
{
String[] AddZeroStr = {"0","00"};
floatStr = AddZeroStr[2-len-1] + floatStr;
}
for(int i=0;i<2;i++)
{
int num = floatStr.charAt(i)-'0';
if(i==0)
{
rst_jiao += ChineseArr[num] ;
if( num != 0)
rst_jiao+="角";
}
else
{
if(num != 0)
rst_fen += ChineseArr[num]+"分";
}
}
if (rst_fen.equals("")&&(rst_jiao.equals("零")||rst_jiao.equals("零角")))
rst_jiao = "";
return rst_jiao+rst_fen;
}
public static void main(String args[])
{
u4s5 a=new u4s5();
System.out.println(a.NumStr2ChineseStr(0));
System.out.println(a.NumStr2ChineseStr(234));
System.out.println(a.NumStr2ChineseStr(1234.56));
System.out.println(a.NumStr2ChineseStr(12341234.56));
System.out.println(a.NumStr2ChineseStr(123412341234.56));
System.out.println(a.NumStr2ChineseStr(100510024002.04));
System.out.println(a.NumStr2ChineseStr(20370337530.2));
System.out.println(a.NumStr2ChineseStr(20300007530.2));
}
}
测试结果如下
我认为本题的难点就是各种读法的情况都要考虑到
本文代码来源 https://blog.csdn.net/liuyunjay66/article/details/38173727
在此基础上有一点自己的小小的改动