实验要求:
编写一个程序,将浮点数转换成人民币读法字符串,例如,将1006.333转换为壹千零陆元参角参分。
实验操作:
代码分析:
1>> 构建三个数组分别存放0~9的汉字表示、整数部分的金额单位、小数部分的金额单位。
private String[] hanArr={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
private String[] unitArr_Integer={"拾","佰","仟","万"};
private String[] unitArr_Decimal={"分","角"};
2>> 构造一个函数divide,对整数和小数进行分离,用String[]作为返回值类型。将浮点数分成整数部分和小数部分字符串,只要把double型的浮点数强制转换成long型即可得到整数部分,将double型的浮点数减去long型的整数部分即可得到浮点数的小数部分,由于只需取两位则乘以100,再用Math.round函数取整得到小数部分。
long zheng = (long) num;//强制转换,得到整数部分
long xiao = Math.round((num - zheng) * 100);//round函数,四舍五入接近整数
return new String[] { zheng + "", String.valueOf(xiao) };
3>> 构造一个函数toHanStr_Integer,用来对所输入数中的整数部分进行处理。其中遇到连续多个零和末尾为零的处理是结束当前循环进行接下来的循环
String result="";
int numLen=numStr.length();
for(int i=0;i<numLen;i++){
int num=numStr.charAt(i)-48;
if(i!=numLen-1&&num!=0){
result+=(hanArr[num]+unitArr_Integer[numLen-2-i]);
}
else{
if(hanArr[num].equals("零")&&result.substring(result.length()-1,result.length()).equals("零")){
continue;
}
else{
result+=hanArr[num];
}
}
}
return result;
4>> 构造一个函数toHanStr_Decimal,来对所输入数中小数部分的处理。
String result="";
int numLen = numStr.length();
for (int i = 0; i < numLen; i++) {
int num = numStr.charAt(i) - 48;
if (i != numLen && num != 0) {
result += (hanArr[num] + unitArr_Decimal[numLen - 1 - i]);
}
}
return result;
5>> 主程序代码如下,其中调用以上三个函数达到最终岁期望的结果。
public static void main(String[] args) {
System.out.println("该程序可以得到整数部分最大为五位的人民币读法转换。"+"\n");
System.out.print("读入一个整数部分最大为五位的数:");
Rmb nr = new Rmb();//根据类Rmb创建一个nr对象
Scanner node=new Scanner(System.in);
double input=node.nextDouble();//输入一个数
System.out.println("要测的人民币金额为:"+input);
String[] str = nr.divide(input);//将整数部分和小数部分分开
String Integer = nr.toHanStr_Integer(str[0]);//对整数部分进行人民币读法转换
String Decimal = nr.toHanStr_Decimal(str[1]);//对小数部分进行人民币读法转换
String Id = Integer + "元" + Decimal;//将整数+元+小数组合在一起
System.out.println(Id);
}
实验结果:
实验总结
通过本次实验我了解到Java语言对数组的操作,和基本类型之间的强制转换(这里用到的是char型到int型的转换和double型到int型的转换)。在该实验中解决了一些特殊情况(如:最高位是零的处理;最低位是零的处理;多个零连在一起的处理)。