`

将小写的人民币数值转换成大写形式

    博客分类:
  • Java
 
阅读更多
前几天遇到的一道笔试题,将小写的人民币数值转换成大写形式,数值取值范围为:0.00-999999999999.99。如输入102411050126.08,则输出:壹仟零贰拾肆亿壹仟壹佰零伍万零壹佰贰拾陆元零角捌分。以下为我编的程序,欢迎各位批评指教。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.util.regex.Pattern;
/**
 * 将小写的人民币数值转换成大写形式,数值取值范围为:0.00-999999999999.99
 * 如输入102411050126.08,则输出:壹仟零贰拾肆亿壹仟壹佰零伍万零壹佰贰拾陆元零角捌分
 * @author mcqueen
 *
 */
public class TestC {
	   public static void main(String[] args){
		double money = getRMB();
		String moneyStr=new DecimalFormat("0.00").format(money);//将double的数值转为非科学记数法,且保证只含两位小数
		Pattern pattern = Pattern.compile("[.]");
        String[] strs = pattern.split(moneyStr);//切割分开整数与小数部分
        String moneyBig=strs[0];//整数部分字符表示形式
        String moneySmall=strs[1];//小数部分字符表示形式
        StringBuffer result=new StringBuffer();
        String high="亿";
        String middle="万";
        String low="元";
        String zero="零";
        Double operNumber=Double.valueOf(moneyBig);//整数部分
        if (operNumber>10E7) {//亿级别
        	Double wan=operNumber%10E7;//前八位
        	Double qian=operNumber%10E7%10E3;//前四位
        	result.append(getNumString((operNumber-wan)/10E7));
			result.append(high);//亿
			if ((wan-qian)/10E3<1000) result.append(zero);//若千万位为零,添加"零"
			result.append(getNumString((wan-qian)/10E3));
			result.append(middle);//万
			if (qian<1000)result.append(zero);//若千位数为零,添加"零"
			result.append(getNumString(qian));
			result.append(low);//元
		}else if (operNumber>1*10E3) {//万级别
			Double qian=operNumber%10E3;//前四位
			result.append(getNumString((operNumber-qian)/10E3));
			result.append(middle);//万
			if (qian<1000) {
				result.append(zero);//若千位数为零,添加"零"
			}
			result.append(getNumString(operNumber%10E3));
			result.append(low);//元
			
		}else {//千级别
			result=getNumString(operNumber);
			result.append(low);//元
		}
        Double operFloat=Double.valueOf(moneySmall);
        result.append(getFloatString(operFloat));
        System.out.print("转换成大写格式后为:");
        System.out.println(result);
        System.out.println("*********************************");
     }
	   /**
	    * 从键盘接收用户输入
	    */
	private static double getRMB() {
		double money=0;
		   System.out.println("*********************************");
		   System.out.print("请输入人民币数:");
		   BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
		try {
			   money=Double.valueOf(reader.readLine());
			   while(money>10E11){
				   System.out.println("你输入的数值太大!请重输!");
				  money=Double.valueOf(reader.readLine());
			   }
		} catch (NumberFormatException e) {
			System.out.println("请正确输入数值!");
			System.exit(-1);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return money;
	}
	   /**
	    * 得到人民币整数数值对应的大写表示方式
	    */
	private static StringBuffer getNumString(Double operNumber) {
		StringBuffer result=new StringBuffer();
        if (operNumber>1000) {
        	double tmp=operNumber;
        	int qian=(int)tmp/1000;
        	result.append(getString(qian)+"仟");
        	tmp=tmp-qian*1000;
        	if (tmp>100) {
            	int bai=(int)tmp/100;
    			result.append(getString(bai)+"佰");
    			tmp=tmp-bai*100;
    			if (tmp>10) {
    				int shi=(int)tmp/10;
    				result.append(getString(shi)+"拾");
    				tmp=tmp-shi*10;
    				if (tmp>0) {
    					int ge=(int)tmp;
    					result.append(getString(ge));
    				}
    			}else {
					result.append("零");//十位为零
					int ge=(int)tmp;
					result.append(getString(ge));
				}
			}else {
				result.append("零");//百位为零
	  			if (tmp>10) {
    				int shi=(int)tmp/10;
    				result.append(getString(shi)+"拾");
    				tmp=tmp-shi*10;
    				if (tmp>0) {
    					int ge=(int)tmp;
    					result.append(getString(ge));
    				}
    			}else {
    				int ge=(int)tmp;
					result.append(getString(ge));
				}
			}
		}else if (operNumber>100) {
			double tmp=operNumber;
        	int bai=(int)tmp/100;
        	result.append(getString(bai)+"佰");
        	tmp=tmp-bai*100;
			if (tmp>10) {
				int shi=(int)tmp/10;
				result.append(getString(shi)+"拾");
				tmp=tmp-shi*10;
				if (tmp>0) {
					int ge=(int)tmp;
					result.append(getString(ge));
				}
		}else {
			result.append("零");//十位为零
			if (tmp>0) {
				int ge=(int)tmp;
				result.append(getString(ge));
			}
		}
		}else if(operNumber>10){
			double tmp=operNumber;
			int shi=(int)tmp/10;
			result.append(getString(shi)+"拾");
			tmp=tmp-shi*10;
			if (tmp>0) {
				int ge=(int)tmp;
				result.append(getString(ge));
			}
		}else {
			double tmp=operNumber;
			int ge=(int)tmp;
			if(ge==0)
				result.append("零");//处理输入的值为零的情况
			else 
				result.append(getString(ge));
		}
		return result;
	}
	/**
	 * 得到人民币小数部分对应的大写表示方式
	 */
	private static StringBuffer getFloatString(Double operNumber) {
		StringBuffer result=new StringBuffer();
		if (operNumber>0) {
			if (operNumber>10){
				double tmp=operNumber;
				int jiao=(int)tmp/10;
				result.append(getString(jiao)+"角");
				tmp=tmp-jiao*10;
				if (tmp>0) {
					int fen=(int)tmp;
					result.append(getString(fen)+"分");
				}
			}else {
				double tmp=operNumber;
				int fen=(int)tmp;
				result.append("零角"+getString(fen)+"分");
			}
		}else if (operNumber==0) {
			result.append("零角零分");
		}
		
		return result;
	}
	   /**
	    * 得到数字对应的汉字
	    */
	   public static String getString(int number){
		   switch (number) {
		case 1:
			return Change.YI.getName();
		case 2:
			return Change.ER.getName();
		case 3:
			return Change.SAN.getName();
		case 4:
			return Change.SI.getName();
		case 5:
			return Change.WU.getName();
		case 6:
			return Change.LIU.getName();
		case 7:
			return Change.QI.getName();
		case 8:
			return Change.BA.getName();
		case 9:
			return Change.JIU.getName();
		}
		   return null;
	   }
	   
}
/**
 * 每个数字对应的汉字
 * @author mcqueen
 */
enum Change{
	YI{public String getName(){
		return "壹";
		}
	},
	ER{public String getName(){
		return "贰";
		}
	},
	SAN{public String getName(){
		return "叁";
		}
	},
	SI{public String getName(){
		return "肆";
		}
	},
	WU{public String getName(){
		return "伍";
		}
	},
	LIU{public String getName(){
		return "陆";
		}
	},
	QI{public String getName(){
		return "柒";
		}
	},
	BA{public String getName(){
		return "捌";
		}
	},
	JIU{public String getName(){
		return "玖";
		}
	},
	SHI{public String getName(){
		return "拾";
		}
	};
	public abstract String getName();
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics