1. 程式人生 > >【陣列】將一串整型數轉換為人民幣讀法

【陣列】將一串整型數轉換為人民幣讀法

 最近在啃《瘋狂Java講義》,看到第四章有一道題RT,“折磨”了我這隻菜鳥兩天時間,到現在終於有點樣子了,先記錄下來,由於此時沒有看書後面的章節,很多知識點還不甚清楚(誰讓我在學校上Java的時候水了一波呢,0.0),所以等以後知識點了解得更多的時候再回來重新理一理邏輯,各位看官若覺得有簡化的邏輯可tell me,3q~

 主要思路為:中國的數字是每四位一節,一個四位數可以轉化為幾千幾百幾十幾,至於後面加什麼單位不確定,但如果這四位數字出現在1~4位,則後面新增單位元;如果這四位數字出現在5~8位,則後面新增單位萬;如果這四位數字出現在9~12位,則後面新增單位億;暫不考慮多於12位的情況。

 鑑於此,建立一個3×4的二維陣列(初始化值為-1),每四位數存一行,從小到大依次存放,舉個栗子123456789159,存為:

a[0] 9 1 5 9 新增單位:元

a[1] 5 6 7 8 新增單位:萬

a[2]  1 2 3 4   新增單位:億
   ↑ ↑ ↑

 ×

具體單位新增見上述栗子,再次就不文字贅述辣~

先上完整程式碼叭,粗陋之處多多見諒!

package Chapter4;

public class Num2Rmb {
	private String[] hanArr = {"零","壹","貳","叄","肆","伍","陸","柒","捌","玖"};
	private String[] unitArr = {"拾","佰","仟"};
	private String[] bigUnitArr = {"元","萬","億"};
	 
	private String String2Array(String numStr) {
		String result = "";
		//定義二維陣列
		int[][] numArr = new int[3][4];
		//初始化二維陣列所有值為-1
		for(int i = 0; i < 3; i++) {
			for(int j = 0; j < 4;j++) {
				numArr[i][j] = -1;
			}
		}
		//待轉換字串長度
		int numLen = numStr.length();
		int index = numLen - 1;
		//當前待轉換字串下標值
		for(int i = 0; i <= numLen / 4;i++) {
			for(int j = 3; j >= 0; j--) {
				if(index >= 0) {
					numArr[i][j] = numStr.charAt(index--) - 48;
				}
				else {
					break;
				}
			}
		}
//		列印輸出存好資料的二維陣列
		for(int i = 0;i < 3;i++) {
			for(int j = 0;j < 4;j++) {
				System.out.print(numArr[i][j]);
			}
			System.out.println();
		}
		for(int i = (numLen - 1) / 4;i >= 0;i--) {
			for(int j = 0; j < 4 ; j++) {
				int num = numArr[i][j];
				//當前位未存入數字
				if(num == -1) {
					continue;
				}
				//當前位為0
				else if(num == 0) {
					//首位為零 或 上一位不為零且該位不是第四位
					if(j == 0 || (j != 3 && numArr[i][j-1] != 0))
						result += hanArr[0];
				}
				//當前位不為0
				else if(num != 0){
					//當前位不是最後一位
					if(j != 3) {
						result += hanArr[num] + unitArr[2 - j];
					}
					else {
						result += hanArr[num];
					}
				}
			}
//			每四位數一次外迴圈,
//			若該層四個數均為0,則不加單位
//			迴圈完畢加上每四位數的大單位
			if(numArr[i][0] == 0 && numArr[i][1] == 0 &&
					numArr[i][2] == 0 && numArr[i][3] == 0){
				continue;
			}
			result += bigUnitArr[i];
		}
		return result;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Num2Rmb nr = new Num2Rmb();
		//預設輸入資料位數不超過12位
		System.out.println(nr.String2Array("800001504"));
	}

}


 1.先將需要用到的中文字存到對應的陣列,如下:

private String[] hanArr = {"零","壹","貳","叄","肆","伍","陸","柒","捌","玖"};
	private String[] unitArr = {"拾","佰","仟"};
	private String[] bigUnitArr = {"元","萬","億"};

 2.建立3×4二維陣列,用來存放輸入的一串整型數字,並初始化陣列值為-1:
//定義二維陣列
		int[][] numArr = new int[3][4];
		//初始化二維陣列所有值為-1
		for(int i = 0; i < 3; i++) {
			for(int j = 0; j < 4;j++) {
				numArr[i][j] = -1;
			}
		}
 3.將測試的整形字串存入整型二維陣列:
//待轉換字串長度
		int numLen = numStr.length();
		//待轉換字串最大下標值
		int index = numLen - 1;
		//當前待轉換字串下標值
		for(int i = 0; i <= numLen / 4;i++) {
			for(int j = 3; j >= 0; j--) {
				if(index >= 0) {
					numArr[i][j] = numStr.charAt(index--) - 48;
				}
				else {
					break;
				}
			}
		}
 4.開始讀數,難點在於“0”值的討論:

 我的思路是:1)先從存有數的那一行開始依次遍歷一行內四列的數值,若為-1則continue,意思是直接跳到那一行中存有

值的那列去。

 2)討論當前數num的值,主要分為0和!0的情況。如果當前數num為0,此時開始討論當前數所處位置,若處於首位或不

在末位且前一位不為零的情況,則需在輸出的字串result中加上hanArr[0],即“零”;如果當前數num不為0,則如書中程式碼

所列,正常轉換成中文就行,但需注意,若當前數為最後一位不新增unitArr[]陣列中的單位。

 3)遍歷完一行後,開始外層迴圈(注意外迴圈是從大到小遍歷),此時需要判斷一個情況:如果該行四個數均為0,則習慣

讀法是不新增單位。

for(int i = (numLen - 1) / 4;i >= 0;i--) {
			for(int j = 0; j < 4 ; j++) {
				int num = numArr[i][j];
				//當前位未存入數字
				if(num == -1) {
					continue;
				}
				//當前位為0
				else if(num == 0 && (j == 0 || (j != 3 && numArr[i][j-1] != 0))) {
					result += hanArr[0];
					//首位為零 或 上一位不為零且該位不是第四位
//					if(j == 0 || (j != 3 && numArr[i][j-1] != 0))
//						result += hanArr[0];
				}
				//當前位不為0
				else if(num != 0){
					//當前位不是最後一位
					if(j != 3) {
						result += hanArr[num] + unitArr[2 - j];
					}
					else {
						result += hanArr[num];
					}
				}
			}
//			每四位數一次外迴圈,
//			若該層四個數均為0,則不加單位
//			迴圈完畢加上每四位數的大單位
			if(numArr[i][0] == 0 && numArr[i][1] == 0 &&
					numArr[i][2] == 0 && numArr[i][3] == 0){
				continue;
			}
			result += bigUnitArr[i];
		}