1. 程式人生 > 其它 >阿拉伯數字轉換為中文數字[java實現]

阿拉伯數字轉換為中文數字[java實現]

在網上沒有看到特別完善的阿拉伯數字轉換為中文大寫的程式碼,這裡貼一下,注意int最大隻能表示21億,需要更大數值轉換的話需要將int改成long。

整體思路:每四位劃分為一個section,對每個section進行轉換,主要是處理數字0

對於每個sectiuon,當前數字0不用轉換為零的情況:

  1. 前一位數字為0。    如:1001 第二個0不用轉換為零,因為前面還有一個連續的0
  2. 後面所有位為同時為0 。 如:1000  後面三個0都不用轉換為零
  3. 對於左起第一個section部分,前導0不用轉換為零,對於其他section的前導0需要轉為為一個零。如:1111 0010 前面的兩個0需要轉換為零,但是0010 1111 前面的兩個0就不用管
  4. 對於右起第一個section部分:如果當前section全部是0,不需要轉換為零。如 1 0000 轉換為: 一萬
public class main {
    public static void main(String[] args) {
        Solution so = new Solution();
        System.out.println(numToChniese(100));

    }



static String[] valToChn = {"零","一","二","三","四","五","六","七","八","九"}; static String[] sectionUnit = {"","萬","億","萬億"};
static private String numToChniese(int num){ String res = ""; int index = 0; //等於0 可以表示這是右邊第一個section,用於判定是否將 0000 轉換為零 while(num > 0){ int section = num%10000; num = num/10000; if(num == 0) { //num == 0表示 這是最後一個part 那麼這個part中的前導0不能變成零 如 0010 應該為 一十 String temp = sectionToChniese(section, true
); if(temp == null && index != 0) temp += valToChn[0]; res = temp + sectionUnit[index] + res ; } else{ //非最後一個part 前導0可以變成零 如 1 0001 為:一萬零一 String temp = sectionToChniese(section, false); if(temp == null && index != 0) temp += valToChn[0]; //整個section都為0的情況:如果當前section是最右側的section就不用轉換為零,如 1 0000 一萬 res = temp + sectionUnit[index] + res ; } index++; //section的權重上升 } return res; }
//輔助函式:將4位的section轉換為中文,對於0000是會返回 null,因此 0000需要主邏輯特判 static private String sectionToChniese(int section, boolean isFirstSection){ StringBuilder sb = new StringBuilder(); int qian = (section/1000)%10; //取出千位 int bai = (section/100)%10; int shi = (section/10)%10; int ge = (section/1)%10; if(qian != 0){ sb.append(valToChn[qian]).append("千"); }else if(isFirstSection || (bai == 0 && shi == 0 && ge == 0)){ //不加零的情況: 前面一位是0 或者 後面所有位為0 }else{ sb.append(valToChn[0]); //0不用新增單位 } if(bai != 0 ){ sb.append(valToChn[bai]).append("百"); }else if(bai == 0 && (qian == 0 || (ge == 0 && shi == 0))){ //不加零的情況: 前面一位是0 或者 後面所有位為0 }else{ sb.append(valToChn[0]); } if(shi != 0 ){ sb.append(valToChn[shi]).append("十"); }else if(shi == 0 && (bai == 0 || (ge == 0 ))){ //不加零的情況: 前面一位是0 或者 後面所有位為0 }else{ sb.append(valToChn[0]); } if(ge != 0){ //個位為0直接不用翻譯了 sb.append(valToChn[ge]); } return sb.toString(); } }