论坛首页 入门技术论坛

《疯狂java讲义》第2版第四章课后题第2题讨论

浏览 3020 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-04-08  
题目:编写一个程序将浮点数转换为人民币读法,例如,将1006.333转换为壹千零陆元叁角叁分!!!

以下是楼主的解答方法,希望朋友们能帮忙优化以下本程序,同时提出一些本程序中的问题,楼主在这里不甚感激!!!

import java.util.Scanner;
public class Num2Rmb {
//定义一个人民币读法数组
private String [] hanArr={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
//定义一个单位数组
private String [] unitArr={"十","百","千"};
//定义一个人民币单位
private String [] unitRmb={"元","角","分"};
public String Str="";
   


public void readNum(float num)
{
//提取浮点数整数部分
int numInt = (int)num;
    //提取小数部分
int numDec = Math.round((num-numInt)*100);
//将整数部分和小数部分合并成一个字符串
String str = ""+numInt+numDec;
int numLen=str.length();
String numRmb = "";
//扫描字符串每一个字符
for(int i=0;i<numLen;i++)
{
int numCh = str.charAt(i)-48;
//先读取整数部分
if(i>=0&&i<3&&numCh!=0)
{
numRmb += (hanArr[numCh]+unitArr[2-i]);
}
//判断第2位和第3位均为0的情况!!!
else if(i==1&&numCh==0)
{

int j=i+1;
   
if(numCh==0)
    {
    numRmb +="";
    }
    else
    {
    numRmb += "零";
    }
}
//判断后3位均为0的情况!!!
else if(i==2&&numCh==0)
{

int j=i+1;
if(numCh==0)
{
numRmb += "";
}
else
{
numRmb += "零";
}
}
else if(i==3&&numCh==0)
{
numRmb += "";
}
else if(i==3)
{
numRmb += hanArr[numCh];
}
}
numRmb += unitRmb[0];
//再读取小数部分
for(int j=4;j<numLen;j++)
{
int numCh = str.charAt(j)-48;

if(0<numDec&&numDec<10)
{
numRmb += "零";
numRmb += (hanArr[numCh]+unitRmb[j-2]);
}


else if(numDec>=10)
{
if(numCh!=0)
numRmb += (hanArr[numCh]+unitRmb[j-3]);
else
numRmb += "";
}
}
System.out.println(numRmb);
}



public static void main(String[] args) {
System.out.println("请输入需要转换的4位浮点数!");
//读取键盘输入
Scanner scanner = new Scanner(System.in);
//输入一个浮点数
float num = scanner.nextFloat();
//判断输入是否合法
if(num>=1000&&num<10000)
{
Num2Rmb NR = new Num2Rmb();
    NR.readNum(num);
}
else
{
System.out.println("对不起!您的输入有误!!!");
}
}
}
   发表时间:2012-04-10  
根据人民币大写金额规范,转换有几点要注意的:
1. 阿拉伯数字中间有“0”时,中文大写金额中间可以只写一个“零”字。如¥1,409.50,应写成人民币壹仟肆佰零玖元伍角。
2. 阿拉伯数字中间连续有几个“0”,中文大写金额中间可以只写一个“零”字,如¥6,007.14,应写成人民币陆仟零柒元壹角肆分。
3. 阿拉伯金额数字万位或元位是“0”,或者数字中间连续有几个“0”,万位、元位也是“0”,但仟位、角位不是“0”时,中文大写金额中可以只写一个零字,也可以不写“零”字,如¥1,680.32,应写成人民币壹仟陆佰捌拾元零三角贰分,或者写成人民币壹仟陆佰捌拾元三角贰分;又如¥107,000.53,应写成人民币壹拾万柒仟元零伍角叁分,或者写成人民币壹拾万柒仟元伍角叁分。
4. 阿拉伯金额数字角位是“0”,而分位不是“0”时,中文大写金额“元”后面应写“零”字。如¥16,409.02,应写成人民币壹万陆仟肆佰零玖元零贰分;又如¥325.04,应写成人民币叁佰贰拾元零肆分。
5.大写金额到“元”为止的,在“元”之后应写上“整”或“正”字,在“角”之后可以不写“整”或“正”字,在“分”之后的不写”整“或”正“字。


我的思路是:
1.将输入格式化成:“xxxx,xxxx,xx”,以千位划分整数部分,小数部分保留两位(到分位);
2.将输入拆分为整数部分和小数部分;
3.倒序逐位转换,先处理小数部分,再处理整数部分;
4.转换后,根据人民币大写金额规范处理多余的“零”字。

package avstudio.utils;

import java.text.DecimalFormat;

/**
 * Program Name: ConvertRMB <br />
 * Description: 将浮点金额转换成人民币读法,精确到分,例如输入:1006.33,输出:壹仟零陆元叁角叁分 <br /> 最大支持值到9999999999999998 <br />
 * Date: 2011-10-19 <br />
 * @author ChiAlvin.Chan
 */

public class ConvertRMB {
	
	/**
	 * @param d 需要转换的金额
	 * @return 返回大写金额字符串(String)
	 */
	public static String convert(double d) {
		String[] numTables = new String[]{"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
		String[] unitTables = new String[]{"分", "角"};
		String[] levelTables = new String[]{"万", "亿"};
		String[] mulTables = new String[]{"", "拾", "佰", "仟"};
		StringBuffer result = new StringBuffer();
		int index = -1;
		
		// 将数字格式化为xxxx.xx
		DecimalFormat df = new DecimalFormat();
		df.setGroupingSize(4);
		df.setMinimumFractionDigits(2);
		String strFormat = df.format(d);
		
		// 拆分整数部分和小数部分
		StringBuffer intPart = new StringBuffer(strFormat.substring(0, strFormat.length()-3));
		StringBuffer decimalPart = new StringBuffer(strFormat.substring(intPart.length()+1, strFormat.length()));
		
		// 处理小数部分
		decimalPart.reverse();
		for(int i=0; i<decimalPart.length(); i++) {
			result.append(unitTables[i%2]);
			result.append(numTables[Character.getNumericValue(decimalPart.charAt(i))]);
		}
		
		// 处理整数部分
		result.append("元");
		intPart.reverse();
		int level = 0;
		for(int i=0; i<intPart.length(); i++) {
			if(intPart.charAt(i) != ',') {
				result.append(mulTables[i%5]);
				result.append(numTables[Character.getNumericValue(intPart.charAt(i))]);
			} else {
				result.append(levelTables[level]);
				level = ++level % 2;
			}
		}
		
		result.reverse();
		
		// 处理多余的零
		while((index = result.indexOf("零分")) != -1){ result.deleteCharAt(index+1); };
		while((index = result.indexOf("零角")) != -1){ result.deleteCharAt(index+1); };
		while((index = result.indexOf("零拾")) != -1){ result.deleteCharAt(index+1); };
		while((index = result.indexOf("零佰")) != -1){ result.deleteCharAt(index+1); };
		while((index = result.indexOf("零仟")) != -1){ result.deleteCharAt(index+1); };
		// 没有小数部分
		while((index = result.indexOf("元零零")) != -1) {
			result.delete(index+1, index+3);
			result.append("整");
		};
		while((index = result.indexOf("零零")) != -1){ result.deleteCharAt(index); };
		while((index = result.indexOf("零元")) != -1) {result.deleteCharAt(index);};
		while((index = result.indexOf("零万")) != -1) {result.deleteCharAt(index);};
		while((index = result.indexOf("零亿")) != -1) {result.deleteCharAt(index);};
		while((index = result.indexOf("亿万")) != -1) {result.deleteCharAt(index+1);};
		// 没有分位
		while((index = result.indexOf("角零")) != -1){ result.deleteCharAt(index+1); };
		// 只有分位
		while((index = result.indexOf("元零")) != -1 && index == 0){ result.delete(index, index+2); };
		// 只有小数位
		while((index = result.indexOf("元")) != -1 && index == 0){ result.deleteCharAt(index); };
		// 零元
		while((index = result.indexOf("整")) != -1 && index == 0){ result.replace(index, index+2, "零元"); };
		
		return result.toString();
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(ConvertRMB.convert(1680.32));
		System.out.println(ConvertRMB.convert(1409.50));
		System.out.println(ConvertRMB.convert(6007.14));
		System.out.println(ConvertRMB.convert(107000.53));
		System.out.println(ConvertRMB.convert(16409.02));
		System.out.println(ConvertRMB.convert(325.04));
		System.out.println(ConvertRMB.convert(0.01));
		System.out.println(ConvertRMB.convert(2.10));
		System.out.println(ConvertRMB.convert(0.49));
		System.out.println(ConvertRMB.convert(1.49));
		System.out.println(ConvertRMB.convert(1d));
		System.out.println(ConvertRMB.convert(0d));
		System.out.println(ConvertRMB.convert(1234567891012d));
		System.out.println(ConvertRMB.convert(9000000000000d));
		System.out.println(ConvertRMB.convert(9010000000005d));
		System.out.println(ConvertRMB.convert(9999999999999998d));
	}

}
0 请登录后投票
   发表时间:2012-04-10  
谢谢楼上朋友先!!!!
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics