声明RMB人民币类如下,实现其中的成员方法
题目分析:最重要的是考虑如何转换整数金额。首先找到小数点的位置,将金额分为小数和整数部分分别处理。对于整数部分按亿,万,千四位一分进行处理。目前转换范围还存在一定局限,还需继续改进。
代码给出详细注释:
import java.util.Scanner;
import java.text.DecimalFormat; //科学计数法的转换
public class RMB {
static char[] ZhenShuDanWei = {'元', '拾', '佰', '仟', '万', '亿'}; //整数只处理到亿
static char[] XiaoShuDanWei = {'角', '分'}; //小数只处理到分
static char[] Shuzi = {'零', '壹', '贰', '叁', '肆', '伍' ,'陆', '柒', '捌' ,'玖'};
public static String check(char[] money) //对于零的处理应该放在最后一次遇到
{
String ans = new String();
int wet = money.length - 1;
if(wet == 0 && money[0] == '0') //处理金额为小数的情况
{
ans += Shuzi[0];
}
else
{
int sign = 0;//标记是否遇到0
for(int i = 0; i < money.length; i++)
{
if(sign == 0 && money[i] == '0') //第一次遇到了零
{
sign = 1;
}
else if(sign == 1 && money[i] == '0') //在一连串的零后又遇到了零
{
if(i + 1 < money.length && money[i + 1] == '0') continue; //0的后面还是零且不在最后一位
else if(i + 1 < money.length && money[i + 1] != '0') ans += Shuzi[0]; //0的后面不是零且不在最后一位
else if(i == money.length - 1) continue; //到结尾还是零,无需处理
}
else if(sign == 1 && money[i] != '0') //在一连串的零后又遇到了非零数字
{ sign = 0;
ans += Shuzi[Integer.valueOf(money[i]) - 48]; //千万注意Integer.valueOf(money[i])转换的是字符的ascll码值
if(i != wet) ans += ZhenShuDanWei[wet - i]; //不是最后一位才会加上单位
}
else if(sign == 0 && money[i] != '0') //之前一直没有遇到零
{
ans += Shuzi[Integer.valueOf(money[i]) - 48];
if(i != wet) ans += ZhenShuDanWei[wet - i];
}
}
}
return ans;
}
public static String toString(double x)
{
DecimalFormat df = new DecimalFormat("###0.00");
char[] money = df.format(x).toCharArray();
String Zhen = new String(), Xiao = new String();//答案字符串
//记录一下java本身提供的数组复制方法
//System.arraycopy(array, 0, array2, 0, array.length);
//(被复制的数组,从几号下标开始复制,复制到哪个数组,复制到新数组第几号下标,复制长度)
int index = 0; //小数点的位置
for(int i = 0; i < money.length; i++) if(money[i] == '.') {index = i; break;} //获得小数点下标位置
//将小数和整数分开处理,将整数分解成亿,万,千
char[] ZhenShu = new char[index];
System.arraycopy(money, 0, ZhenShu, 0, index); //获取整数金额
//System.out.println(ZhenShu);
//还要修改
int elength = 0, wlength = 0; //当存在亿位和万位时,记录其长度
if(ZhenShu.length > 8) //亿
{
char[] temp = new char[ZhenShu.length - 8];
elength = ZhenShu.length - 8; //存在时记录亿位的长度
for(int i = 0; i < ZhenShu.length - 8; i++) temp[i] = money[i];
Zhen += check(temp);
Zhen += ZhenShuDanWei[5];
}
if(ZhenShu.length > 4) //万
{
if(ZhenShu.length > 8) //存在亿
{
char[] temp = new char[4];
wlength = 4; //存在时记录万位的长度
for(int i = 0; i < 4; i++) temp[i] = money[elength + i];
Zhen += check(temp);
Zhen += ZhenShuDanWei[4];
}
else
{
char[] temp = new char[ZhenShu.length - 4];
wlength = ZhenShu.length - 4; //存在时记录万位的长度
for(int i = 0; i < ZhenShu.length - 4; i++) temp[i] = money[i];
Zhen += check(temp);
Zhen += ZhenShuDanWei[4];
}
}
// 千
if(ZhenShu.length > 4) //存在万
{
char[] temp = new char[4];
for(int i = 0; i < 4; i++) temp[i] = money[elength + wlength + i];
Zhen += check(temp);
Zhen += ZhenShuDanWei[0];
}
else
{
char[] temp = new char[ZhenShu.length];
for(int i = 0; i < ZhenShu.length; i++) temp[i] = money[i];
Zhen += check(temp);
Zhen += ZhenShuDanWei[0];
}
char[] XiaoShu = new char[money.length - index - 1];
System.arraycopy(money, index + 1, XiaoShu, 0, money.length - index - 1); //获取小数金额
//System.out.println(XiaoShu);
int isDigit = ((XiaoShu.length == 2) && (XiaoShu[0] == '0') && (XiaoShu[1] == '0')) ? 1 : 0; //金额是否是整数
if(isDigit == 1) //如果是整数
{
Zhen += '整';
return Zhen;
}
//处理小数
else
{
if(XiaoShu.length == 2 && XiaoShu[1] == '0') //只有一位
{
Xiao += Shuzi[Integer.valueOf(XiaoShu[0]) - 48];
Xiao += XiaoShuDanWei[0];
}
else if(XiaoShu.length == 2 && XiaoShu[0] == '0') //两位,第一位为0
{
Xiao += Shuzi[Integer.valueOf(XiaoShu[1]) - 48];
Xiao += XiaoShuDanWei[1];
}
else //两位,都有数字
{
Xiao += Shuzi[Integer.valueOf(XiaoShu[0]) - 48];
Xiao += XiaoShuDanWei[0];
Xiao += Shuzi[Integer.valueOf(XiaoShu[1]) - 48];
Xiao += XiaoShuDanWei[1];
}
return Zhen + Xiao;
}
}
public static void main(String[] args)
{
Scanner get = new Scanner(System.in);
System.out.print("请输入需要转换的金额:");
double num = get.nextDouble();
if(num == 0.0) System.out.println("零元整"); //处理特殊情况
else System.out.println(RMB.toString(num));
get.close();
}
}