【Java】將阿拉伯數字金額轉化爲中文大寫金額表示

今天老師即興佈置了一個作業,將阿拉伯數字金額轉化爲中文大寫金額表示,假設數字上限爲小於10億,可以支持2位小數,如:

  • 100000001——壹億零壹元整
  • 100100011——壹億零壹拾萬零壹拾壹元整
  • 201000211——貳億零壹佰萬零貳佰壹拾壹元整
  • 2422000.21——貳佰肆拾貳萬貳千元貳角壹分

拿到題目,想到先拿兩個數組來存放數字和單位,把阿拉伯數字都轉換爲大寫數字和單位組合的形式,如:

  • 112000012——壹億壹仟貳佰零拾零萬零仟零佰壹拾貳元整

然後將轉換後的字符串進行加工,將"零[拾佰仟]"等變成"零",考慮"零萬"變成"零"還是"萬",這一步是比較麻煩的,要考慮比較多的情況,如:

  • 112000012——壹億壹仟貳佰零零萬零零壹拾貳元整

然後將相鄰的"零"去重,如:

  • 112000012——壹億壹仟貳佰萬零壹拾貳元整

以下爲具體代碼,可能還有一些情況沒有考慮到,暫時記錄如下。

package com.zzutest;

import java.text.DecimalFormat;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Transfer2 {
    public static void main(String[] args) {
    	Scanner scan= new Scanner(System.in);
    	while(true) {
    		System.out.println("請輸入您想要轉化的數字:");
    		String number=scan.next();
    		if(number.equals("0")) {
    			break;
    		};
            //System.out.println(cov(convert(number)));
        	System.out.println("轉換結果爲:"+convert(number));
    	}
    }

    private static final char[] data = new char[]{'零', '壹', '貳', '叄', '肆', '伍', '陸', '柒', '捌', '玖'};
    private static final char[] units = new char[]{'分', '角', '元', '拾', '佰', '仟', '萬', '拾', '佰', '仟', '億'};

    private static String removeCharAt(String str, int i) {
		return str.substring(0, i)+str.substring(i+1);
	}
    
//    //將相鄰的‘零’去重
//    private static String changeZero(String str) {
//    	str.replace('零', ' ');
//		String no = str.replaceAll("\\s{1,}", " ");
//		no.replace(' ', '零');
//		System.out.println(no);
//    	return no;
//    }
    
    /**
     * 小數類型
     * @param str
     * @return
     */
    private static String cov(String str,String trans) {
    	StringBuffer sb = new StringBuffer(trans);
    	
    	if(Double.parseDouble(str)>100000000) {
    		String wan=str.substring(1, 5);
    		//System.out.println("$$$$$$$$$$$$$$wande    is     "+wan);
    		int wanValue = Integer.parseInt(wan);
    		if(wanValue>0) {
    			trans = sb.toString()
    					.replaceAll("零拾", "零")
    					.replaceAll("零佰", "零")
    					.replaceAll("零仟", "零")
    					.replaceAll("零萬", "萬")
    					.replaceAll("零元", "元")
    					.replaceAll("零角", "零")
    					.replaceAll("零分", "")
    					.replaceAll("零零", "零")
    					.replaceAll("零零", "零")
    					.replaceAll("零零", "零")
    					.replaceAll("零零", "零")
    					.replaceAll("零零", "零")
    					.replaceAll("零零", "零")
    					.replaceAll("零萬", "萬");
    			
    		}else if(wanValue==0){
    			trans = sb.toString()
    					.replaceAll("零拾", "零")
    					.replaceAll("零佰", "零")
    					.replaceAll("零仟", "零")
    					.replaceAll("零萬", "零")
    					.replaceAll("零元", "元")
    					.replaceAll("零角", "零")
    					.replaceAll("零分", "")
    					.replaceAll("零零", "零")
    					.replaceAll("零零", "零")
    					.replaceAll("零零", "零")
    					.replaceAll("零零", "零")
    					.replaceAll("零零", "零")
    					.replaceAll("零零", "零");
    		}
    	}else if(Double.parseDouble(str)>10000 && Double.parseDouble(str)<100000000) {
			trans = sb.toString()
					.replaceAll("零拾", "零")
					.replaceAll("零佰", "零")
					.replaceAll("零仟", "零")
					.replaceAll("零萬", "萬")
					.replaceAll("零元", "元")
					.replaceAll("零角", "零")
					.replaceAll("零分", "")
					.replaceAll("零零", "零")
					.replaceAll("零零", "零")
					.replaceAll("零零", "零")
					.replaceAll("零零", "零")
					.replaceAll("零零", "零")
					.replaceAll("零零", "零");
    	}else if(Double.parseDouble(str)<10000 && Double.parseDouble(str)>0) {
    		trans = sb.toString()
					.replaceAll("零拾", "零")
					.replaceAll("零佰", "零")
					.replaceAll("零仟", "零")
					.replaceAll("零元", "元")
					.replaceAll("零角", "零")
					.replaceAll("零分", "")
					.replaceAll("零零", "零")
					.replaceAll("零零", "零")
					.replaceAll("零零", "零")
					.replaceAll("零零", "零")
					.replaceAll("零零", "零")
					.replaceAll("零零", "零");
    	}
    	
        return new StringBuffer(trans).toString();
    }

    /**
     * 整數類型
     * @param str
     * @return
     */
    private static String covZ(String str,String trans) {
    	StringBuffer sb = new StringBuffer(trans);
    	
    	if(Double.parseDouble(str)>100000000) {
    		String wan=str.substring(1, 5);
    		System.out.println("$$$$$$$$$$$$$$wande    is     "+wan);
    		int wanValue = Integer.parseInt(wan);
    		if(wanValue>0) {
    			trans = sb.toString()
    					.replaceAll("零拾", "零")
    					.replaceAll("零佰", "零")
    					.replaceAll("零仟", "零")
    					.replaceAll("零萬", "萬")
    					.replaceAll("零元", "元")
    					.replaceAll("元", "元整")
    					.replaceAll("零零", "零")
    					.replaceAll("零零", "零")
    					.replaceAll("零零", "零")
    					.replaceAll("零零", "零")
    					.replaceAll("零零", "零")
    					.replaceAll("零零", "零")
    					.replaceAll("零萬", "萬");
    		}else if(wanValue==0){
    			trans = sb.toString()
    					.replace("零拾", "零")
    					.replace("零佰", "零")
    					.replace("零仟", "零")
    					.replace("零萬", "零")
    					.replace("零元", "元")
    					.replace("元", "元整")
    					.replaceAll("零零", "零")
    					.replaceAll("零零", "零")
    					.replaceAll("零零", "零")
    					.replaceAll("零零", "零")
    					.replaceAll("零零", "零")
    					.replaceAll("零零", "零");
    			//System.out.println("_________爆炸了");
    		}
    	}else if(Double.parseDouble(str)>10000 && Double.parseDouble(str)<100000000) {
			trans = sb.toString()
					.replaceAll("零拾", "零")
					.replaceAll("零佰", "零")
					.replaceAll("零仟", "零")
					.replaceAll("零萬", "萬")
					.replaceAll("零元", "元")
					.replaceAll("元", "元整")
					.replaceAll("零零", "零")
					.replaceAll("零零", "零")
					.replaceAll("零零", "零")
					.replaceAll("零零", "零")
					.replaceAll("零零", "零")
					.replaceAll("零零", "零");
    	}else if(Double.parseDouble(str)<10000 && Double.parseDouble(str)>0) {
    		trans = sb.toString()
					.replaceAll("零拾", "零")
					.replaceAll("零佰", "零")
					.replaceAll("零仟", "零")
					.replaceAll("零元", "元")
					.replaceAll("元", "元整")
					.replaceAll("零零", "零")
					.replaceAll("零零", "零")
					.replaceAll("零零", "零")
					.replaceAll("零零", "零")
					.replaceAll("零零", "零")
					.replaceAll("零零", "零");
    	}
    	
    	
        //StringBuffer sb = new StringBuffer(str);

        //System.out.println("1"+sb.reverse().toString());
        //str = sb.reverse().toString().replaceAll("零[拾佰仟]", "零").replaceAll("零+萬", "萬").replaceAll("零+元", "元").replaceAll("零+", "零");
       // System.out.println("2"+str);
        return new StringBuffer(trans).toString();
    }
    
    /**
     * 現將各個後面統統加上單位 
     * @param money
     * @return
     */
    public static String convert(String money) {
    	//判斷輸入是否包含小數點
    	//包含小數點
    	if(money.contains(".")) {
    		//將字符串轉爲double類型
    		double moneyT=Double.parseDouble(money);
            DecimalFormat df = new DecimalFormat(".00");
//            System.out.println("##############"+df.format(moneyT));
            //得到標準的小數字符串,即小數點後兩位數
            String moneyC=df.format(moneyT);
            //小數點的位置
            int location = moneyC.indexOf(".");
            //System.out.println("the location is "+location);
            //除去小數點後
            //System.out.println("the location which has been conved is "+removeCharAt(moneyC,location));
            //使用double類型來標識該數字
            double finalNum=Double.parseDouble(removeCharAt(moneyC,location));
    		//聲明定義StringBuffer來存轉換後的字符串
    		StringBuffer sbf = new StringBuffer();
	        int unit = 0;
	        //逐位進行大寫化,最低位開始依次向上,得到的字符串是倒序的
	        while (finalNum > 1) {
	        	//單位
	            sbf.insert(0, units[unit++]);
	            double number = finalNum % 10;
	            sbf.insert(0, data[(int)number]);
	            finalNum /= 10;
	            //System.out.println("**********"+finalNum);
	        }
	        //System.out.println("加上單位以後未經轉換的格式爲:  "+sbf.toString());
	        String judged = cov(money,sbf.toString());
	        //System.out.println("經過格式判斷的數字爲:   " + judged);
	        return judged;
    	}
    	//不包含小數點的輸入
    	else {
    		int moneyT=Integer.parseInt(money);
    		//System.out.println("---------------->int類型:"+moneyT);
    		StringBuffer sbf = new StringBuffer();
    	        int unit = 2;
    	        while (moneyT != 0) {
    	            sbf.insert(0, units[unit++]);
    	            int number = moneyT % 10;
    	            sbf.insert(0, data[number]);
    	            moneyT /= 10;
    	        }
    	        //System.out.println("加上單位以後未經轉換的格式爲:  "+sbf.toString());
    	        String judged = covZ(money,sbf.toString());
    	        //System.out.println("經過格式判斷的數字爲:   " + judged);
    	        return judged;
    	}
       
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章