浮点数字转为大写人民币读法---来自《疯狂Java讲义》第四章的数组应用

浮点数字转为大写人民币读法

本文内容源自李刚著《疯狂Java讲义》第3版第四章末数组的一个例子,原文目的是将一个4位数字字符串转换成一个中文人民币的读法,并给出了代码,但并未完善,我对其进行了更改和完善,解决了结果中连续出现多个“零”的问题,且能够支持整数位最高12位,另外,完善了小数部分的转换。我也是初学者,在此分享代码,自认为还有很多不足,仅供参考。微笑

</pre><pre class="java" name="code">// 浮点数字转为大写人民币读法(最高支持整数12位, 即"千亿")

import java.util.Arrays; // 可用于将整个数组转为字符串

public class Num2Rmb
{
	// 定义汉字大写和单位
	private String[] hanArr = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
	private String[] unitArr = { "拾", "佰", "仟", "万", "亿"};
	/**
	 * 将一个浮点数分解成整数部分和小数部分字符串
	 * @param num 需要被分解的浮点数
	 * @return 分解出来的整数部分和小数部分. 第一个数组元素是整数部分, 第二个数组元素是小数部分
	 */
	private String [] divide(double num)
	{
		long zheng = (long) num; // 强制转换类型, 得到整数部分 
		long xiao = Math.round((num - zheng) * 100); // 浮点数减去整数部分得到小数部分, 乘以100后取整得到2位小数
		String[] dividedArr;
		if (xiao == 0) {
			dividedArr = new String [] {zheng + ""}; // 小数部分为0则只返回整数部分
		}
		else {
			dividedArr = new String [] {zheng + "", String.valueOf(xiao)};   // 整数转为字符串的两种方法
		}
		return dividedArr; 
	}
	/**
	 * 获取数字的单位
	 * @param num: 当前数字, modValue: 余数因子, len: 该数字字符串长度, i: 当前索引值
	 * @return 数字正确的单位
	 */
	private String getUnit(int num, int modValue, int len, int i)
	{
		String temp = ""; // 临时存放单位
		switch (modValue)
		{
			case 2:
				if (num != 0)
					{temp = unitArr[0];} break; // 拾
			case 3:
				if (num != 0)
					{temp = unitArr[1];} break; // 佰
			case 0:
				if (num != 0)
					{temp = unitArr[2];} break; // 仟
			case 1: // 1的情况分三种, 为'万'和'亿'和无单位
				if ((len - i) / 4 == 1)
					{temp = unitArr[3];} // 万
				else if((len - i) / 4 == 2)
					{temp = unitArr[4];} // 亿
				else if((len - i) / 4 == 0)
					{temp = "";} // 无单位
				break;
		}
		return temp;
	}
	/**
	 * 去除转换后的汉字字符串中多余的"零", 以符合读法规则
	 * @param rmbStr:前期转换并添加单位完成的字符串
	 * @return 将多余零去掉之后的字符串
	 */
	private String delZero(String rmbStr)
	{
		String result = ""; // 存放复制结果
		for(int i = 0; i < rmbStr.length(); i++) // 遍历转换完而未修整去零的字符串
		{
			if (rmbStr.charAt(i) != '零')  {result += rmbStr.charAt(i);} // 非'零'字符,直接复制
			else if(i != rmbStr.length() - 1 && rmbStr.charAt(i + 1) != '元' && rmbStr.charAt(i + 1) != '零' && 
						   rmbStr.charAt(i + 1) != '亿' && rmbStr.charAt(i + 1) != '万')
				{result += rmbStr.charAt(i);} // 字符'零', 后面为空/'元'/'零'/'亿'/'万', 则均不复制此'零'
		}
		return result;
	}
	/**
	 * 把数字字符串转为汉字字符串
	 * @param origin_num 需要被转换的原数字
	 * @return 数字字符串转换而成的汉字字符串
	 */
	private String toHanStr(double origin_num)
	{
		String [] numArr = divide (origin_num);
		String convert = ""; // 存放转换结果
		// 整数部分
		int intLen = numArr[0].length(); // 整数字符串的长度
		for (int i = 0; i < intLen; i++) // 遍历整数字符串
		{
			int mod = (intLen - i) % 4; // 四位一分的余数因子0, 1, 2, 3
			//System.out.println("mod: " + mod); // 依据位置规律选择单位
			int num = numArr[0].charAt(i) - 48; // 每个字符转为数字(ASCII码值)
			if (i != intLen -1) // 如果不是最后一位数字, 则需要添加单位
				{convert += hanArr[num] + getUnit(num, mod, intLen, i);}
			else
				{convert += hanArr[num];} // 如果是最后一位, 直接将数字转汉字, 无需单位
		}
		convert += "元";
		// 小数部分
		if (numArr.length == 2) // 说明有小数部分元素
		{
			int floatNum = Integer.parseInt(numArr[1]); // 数组元素转整数
			if (floatNum < 10)  {convert += "零" + hanArr[floatNum] + "分";}
			else if (floatNum >= 10) // 两位数
			{
				int i = floatNum / 10; // 得十位, 即"角"
				int j = floatNum % 10; // 得个位, 即"分"
				convert += hanArr[i] + "角" + hanArr[j] + "分";
			}
		}
		return delZero(convert); // 返回去除多余"零"的字符串
	} 

	public static void main(String[] args)
	{
		Num2Rmb nr = new Num2Rmb();
		System.out.println(Arrays.toString(nr.divide(5600.25))); // 测试将浮点数分解为整数部分和小数部分
		System.out.println(nr.toHanStr(5178.53)); // 调用转换方法
	}
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值