浮点数字转为大写人民币读法
本文内容源自李刚著《疯狂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)); // 调用转换方法
}
}