【陣列】將一串整型數轉換為人民幣讀法
最近在啃《瘋狂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];
}