将浮点数转换成人民币读法(疯狂Java讲义第四章)新手,写得有点乱
import java.io.*;
import java.util.Arrays;
import java.math.BigDecimal;
import java.text.DecimalFormat;
public class Test4
{
//
static String[] capitalArr = new String[]{"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
static String[] unitArr = new String[]{"拾","佰","仟","萬","拾萬","佰萬","仟萬","亿"};
static String[] rmbArr = new String[]{"圆","角","分"};
private static String[] divide(double num)
{
//获取整数部分
long zheng = (long)num;
DecimalFormat df = new DecimalFormat("0.000000000");
String xiao = "";
//使用BigDecimal对象确保精度,并对num,zheng进行格式化处理
BigDecimal bd1 = new BigDecimal(df.format(num));
BigDecimal bd2 = new BigDecimal(df.format(zheng));
//获取小数部分
BigDecimal bd3 = bd1.subtract(bd2);
//将BigDecial对象转换成String对象,截取索引为2,3的字符
xiao += bd3.toString().substring(2,4);
//返回字符串数组
return new String[]{String.valueOf(zheng),xiao};
}
private static String num2han(String zhengArr,String xiaoArr)
{
String result = "";
//获取整数部分字符串的长度
int zhengLen = zhengArr.length();
//获取小数部分字符串的长度
int xiaoLen = xiaoArr.length();
//如果整数部分为0,整数部分处理完毕
//开始处理整数部分
if(Long.parseLong(zhengArr) == 0)
{
result += "零";
}
//如果整数部分为0,对整数部分的字符串进行处理
else
{
//遍历整数部分字符串的字符
for(int i = 0;i < zhengLen;i++)
{
//将数字字符转换成数字,'6' - 48 将等于6
int num = zhengArr.charAt(i) - 48;
//如果当前数字不等于0且不是最后一个字符
if(num != 0 && i != zhengLen - 1)
{
//将数字的大写和单位连接
result += capitalArr[num] + unitArr[zhengLen - 2 - i];
}
//如果当前数字为零且不是最后一个数字
else if(num == 0 && i != zhengLen - 1)
{
//获取下一个数字
int temp = zhengArr.charAt(i + 1) - 48;
//如果下一个数字为零,无需将当前数字的大写和单位进行连接
if(temp == 0)
{
result += "";
}
//如果下一个数字不为零
else
{
//将当前数字的大写连接
result += capitalArr[num];
}
}
//如果当前数字等于零且为最后一个数字,无需将当前数字的大写和单位进行连接
else if(num == 0 && i == zhengLen - 1)
{
result += "";
}
//最后一个数字不为零,连接当前数字的大写
else
{
result += capitalArr[num];
}
}
}
//开始处理小数部分
//如果小数部分为0,连接"整"字符串
if(Integer.parseInt(xiaoArr) == 0)
{
result += rmbArr[0] + "整";
}
//如果小数部分不为0,对小数部分进行处理
else
{
//将人民币的单位"圆"连接
result += rmbArr[0];
//遍历小数部分的字符
for(int i = 0;i < xiaoLen;i++)
{
//同整数部分
int num = xiaoArr.charAt(i) - 48;
//如果数字为零且不是最后一个数字字符
if(num == 0 && i != xiaoLen -1)
{
//将数字的大写连接
result += capitalArr[num];
}
//如果数字为零且是最后一个数字字符
else if(num == 0 && i == xiaoLen -1)
{
//无需连接数字大写和人民币单位
result += "";
}
//如果数字不为零,将当前数字的大写和人民币单位进行连接
else
{
result += capitalArr[num] + rmbArr[i + 1];
}
}
}
return result;
}
//使用递归将多余的"萬"删除
private static String stringProcess(String str)
{
int p1,p2;
p1 = str.indexOf("萬");
p2 = str.lastIndexOf("萬");
if(p1 == p2)
{
return str;
}
StringBuffer strBuff = new StringBuffer(str);
strBuff.deleteCharAt(p1);
return stringProcess(strBuff.toString());
}
public static void main(String[] args) throws Exception
{
//这是一个获取键盘输入的方法
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String inputStr = null;
System.out.print("请输入需要转换的小写数字金额:(0~999999999.99)");
inputStr = br.readLine();
double inputNum = Double.parseDouble(inputStr);
//调用divide方法获取整数部分和小数部分
String[] result = divide(inputNum);
//调用num2han方法将小数部分和整数部分转换成大写
String han = num2han(result[0],result[1]);
//调用stringProcess方法处理多余的"萬"字符串
han = stringProcess(han);
//输出处理完毕的字符串
System.out.print("大写金额:");
System.out.println(han);
}
}