1. 程式人生 > >一個將浮點數轉換成人民幣讀法字串處理(xxxx.xx格式)

一個將浮點數轉換成人民幣讀法字串處理(xxxx.xx格式)

主要是加深對陣列的理解在,這個程式原來是《瘋狂java講義》低第103頁上的一個例子,但是例子並不完整,對0的處理和對末位包括小數點後面處理不完整,因此這裡進行了完善。考慮到人民幣通俗叫法,浮點數格式為(XXXX.XX),轉換為字串格式為(x千x百x十x元x角x分),當然還要考慮末位開始位和零的處理。

程式如下:

public class Num2Rmb {
	private String[] hanArr={"零","壹","貳","叄","肆","伍","陸","柒","捌","玖"};
	private String[] unitArr={"分","角","元","十","百","千"};
	/**
	 * 把一個浮點數分解成整數部分和小數部分字串
	 * @param num 需要被分界飛浮點數
	 * @return 分解出來的整數部分和小數部分,第一部分是整數部分,第二部分是小數部分
	 */
	private String[] divide(double num){
		long zheng=(long)num;    //通過強制轉型得到整數部分
		long xiao=Math.round((num-zheng)*100); //浮點數減去整數部分得到小數部分,小數部分乘以100後得到2位小數值
		return new String[]{""+zheng,String.valueOf(xiao)};   //整數轉換為字串(2種方法)
	}
	
	/**
	 * 把一個四位的數字字串變成漢字字串
	 * @param numStr 需要被轉換的四位數字字串
	 * @return 四位字串被轉換為漢字字串
	 */
	private String toHanStr(String[] numStr){
		String result="";
		int numLen0=numStr[0].length();
		int numLen1=numStr[1].length();
		for(int i=0;i<numLen0;i++){
			int num=numStr[0].charAt(i)-48;     //將char變成對應的int數字
			if(num!=0){							//非零情況
				result+=hanArr[num]+unitArr[1+numLen0-i];
			}
			else if(i!=numLen0-1&&i!=0&&num==0){	//中間位數是零
				result+=hanArr[num];
			}
			else if(i==numLen0-1&&num==0) {			//個位是零
				result+=unitArr[1+numLen0-i];
			}
			else if(i==0&&num==0) {					//最高位是零
				result+="";
			}
		}
		for(int j=0;j<numLen1;j++) {          //小數點後位的處理,角和分     
			int num=numStr[1].charAt(j)-48;
			if(num!=0){
				result+=hanArr[num]+unitArr[1-j];
			}
			if(num==0) {
				result+="";
			}
		}
		return result;
	}
	
	public static void main(String[] arg){
		Num2Rmb nr=new Num2Rmb();
		String[] test=nr.divide(323.23);
		//String[] test2= {"0325","25"};
		System.out.println(nr.toHanStr(test));
		
	}
}

今天下午看了一下,感覺上面程式還有些問題,比如在3003這種資料,中間位數有兩個0的時候結果不對,改進如下

public class Num2Rmb {
	private String[] hanArr={"零","壹","貳","叄","肆","伍","陸","柒","捌","玖"};
	private String[] unitArr={"分","角","元","十","百","千"};
	/**
	 * 把一個浮點數分解成整數部分和小數部分字串
	 * @param num 需要被分界飛浮點數
	 * @return 分解出來的整數部分和小數部分,第一部分是整數部分,第二部分是小數部分
	 */
	private String[] divide(double num){
		long zheng=(long)num;    //通過強制轉型得到整數部分
		long xiao=Math.round((num-zheng)*100); //浮點數減去整數部分得到小數部分,小數部分乘以100後得到2位小數值
		return new String[]{""+zheng,String.valueOf(xiao)};   //整數轉換為字串(2種方法)
	}
	
	/**
	 * 把一個四位的數字字串變成漢字字串
	 * @param numStr 需要被轉換的四位數字字串
	 * @return 四位字串被轉換為漢字字串
	 */
	private String toHanStr(String[] numStr){
		String result="";
		int numLen0=numStr[0].length();
		int numLen1=numStr[1].length();	
		int[] num0=new int[numLen0];
		int[] num1=new int[numLen1];
		//賦值
		for(int i=0;i<numLen0;i++) {
			num0[i]=numStr[0].charAt(i)-48;
		}
		for(int j=0;j<numLen1;j++) {         
			num1[j]=numStr[1].charAt(j)-48;
		}
		
		
		for(int i=0;i<numLen0;i++){
			if(num0[i]!=0){							//非零情況
				result+=hanArr[num0[i]]+unitArr[1+numLen0-i];
			}
			else if(i==0&&num0[i]==0) {					//最高位是零
				result+="";
			}
			
			//中間位是零
			else if(i!=numLen0-1&&i!=0&&num0[i]==0&&num0[i+1]!=0){	      //中間位數是隻有一個零
				result+=hanArr[num0[i]];
			}
			
			else if(i!=numLen0-1&&i!=0&&num0[i]==0&&num0[i+1]==0){	      //中間位數是隻有一個零
				result+="";
			}
			
			else if(i==numLen0-1&&num0[i]==0) {			//個位是零
				result+=unitArr[1+numLen0-i];
			}
			
		}

		for(int j=0;j<numLen1;j++) {
			if(num1[j]!=0){
				result+=hanArr[num1[j]]+unitArr[1-j];
			}
			if(num1[j]==0) {
				result+="";
		}		
		}
		return result;
	}
	
	public static void main(String[] arg){
		Num2Rmb nr=new Num2Rmb();
		String[] test=nr.divide(3003.10);
		//String[] test2= {"3005","25"};
		System.out.println(nr.toHanStr(test));
		
	}
}

改進中將判斷是否連續出現了0