疯狂Java讲义课后题4.5 将浮点数转换成人民币读法字符串

疯狂Java讲义课后题4.5 将浮点数转换成人民币读法字符串

前提假设:整数部分最多12位,小数部分最多2位

思路:

  1. 输入数据后首先将小数部分与整数部分分开
  2. 对于整数部分,首先需要把前四位,中间四位,最后四位分开,分别加”亿“,”万“,”元“单位。还需要考虑几种零存在的情况:1)中间有连零,如1001,只需要读一个零;2)后面有连零,如1000,零不需要读出来。
  3. 对于小数部分,只包含”角“和”分“两位。如果没有小数部分,则整个小数部分都不需要读出来。如果有,则有”几角几分“,”几角“以及”零几分“三种读法。
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
在此基础上有一点自己的小小的改动

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值