java人民幣讀法轉換


實現浮點數轉換成人民幣讀法字符串

編寫一個程序,將浮點數轉換成人民幣讀法字符串,

例如:    將1006.333轉換為壹千零陸元叄角叄分。

 

題意分析:

       將浮點數分成整數部分和小數部分,分開處理整數部分和小數部分。

       小數部分的處理比較簡單,截取保留兩位數字,並將其轉換成幾角幾分的字符串即可。

       整數部分可以以4位數字分為幾個數組,每一個4位數字都是幾千幾百幾十幾(添加適當的單位)。

這4位數字若出現在1~4位,則后面添加‘元’,若出現在5~8位,則添加‘萬’,若出現在9~12位,則添加‘億’。

超過12位以后,暫不考慮,實際上,超過12位數后,double類型存儲溢出,會造成數據的錯誤。

 

代碼編譯分析:

        將浮點數分成整數部分和小數部分字符串,只要把double型的浮點數強制轉換成long型即可得到整數部分,

將double型的浮點數減去long型的整數部分即可得到浮點數的小數部分,由於只需取兩位則乘以100,再用

Math.round函數取整得到小數部分。用“zheng+”“ ”或"String.valueOf(xiao)"將整數轉換為字符串。

        將小數部分的字符串逐個進行判斷,在其后面適當的增加角、分,即可轉換成功。

        將整數部分的字符串補零,使其字符串長度成為4的倍數,以便4位一組的分組。使用字符串截取函數截取后4

位的字符串,並使原字符串更新為除去后4位以后的字符串。

       4位一組的字符串進行漢字字符的轉換,若非最后一位數字且數字不為零,則需添加單位。

       每四位的已轉換好的漢字字符串連接時需注意順序。

 

特殊情況分析:

        若數字小數點后一位為0,如19.08,則需在小數部分轉換時考慮小數部分字符串的長度,若長度為1,則特殊處理。

        若數字如10009所示,后四位截取后為0009,轉換時易出現錯誤,需將其轉換為字符串9后再將其進行漢字字符的

轉換。

        若數字如1009所示,2個零相鄰,則需對轉換時單個字符為0時的前一個字符進行判斷,是否需要進行轉換操作。

        若數字如1890所示,最后一位為零,則需對轉換后的字符串進行判斷最后一個字符是否為零,是否需要刪去。

       若數字如0.89,或10000.89所示,截取的4位字符串位0,則需單獨進行轉換操作。

 1 package 人民幣讀法;  2 
 3 import java.util.Arrays;  4 import java.util.Scanner;  5 
 6 // 編寫一個程序,將浮點數轉換成人民幣讀法字符串,例如,將1006.333轉換為壹千零陸元叄角叄分  7 // D:\瘋狂Java講義\codes\04\4.6 NUM2RMB
 8 
 9 public class Rmb {  10     private  String[] str1 =  {"零","壹","貳","叄","肆","伍","陸","柒","捌","玖"};  11     private  String[] str2 =  {"十","百","千"};  12     private  String[] str3 =  {"角","分"};  13     private  String[] str4 =  {"元","萬","億"};  14 // 把浮點數分解成整數部分字符串
 15     private  String divadeZheng(double num)  16  {  17         long zheng = (long)num;  18 // 整型轉換成字符串
 19         return zheng + "";  20  }  21 // 把浮點數分解成小數部分字符串
 22     private String divadeXiao(double num)  23  {  24         long zheng = (long)num;  25 // 得到浮點數的小數部分
 26         long xiao = Math.round((num-zheng)*100);  27 // 用方法把整型轉換成字符串
 28         return String.valueOf(xiao);  29  }  30     
 31 // 把小數部分的數字字符串轉換成漢字字符串
 32     private String toStr1(String xiao)  33  {  34         String re1 = "";  35         int len = xiao.length();  36         if(len==2)  37  {  38             for(int i = 0;i<2;i++)  39  {  40 // 把字符串轉換成數字
 41                   int num = xiao.charAt(i) - 48;  42 // 數字不為零則需要加單位,為零則不操作
 43                   if(num!=0)  44  {  45                         re1  += str1[num] + str3[i];  46  }  47  }  48  }  49 // 若長度為1,例:12.09小數部分為9
 50         if(len==1&&xiao.charAt(0)!='0')  51  {  52             int num = xiao.charAt(0) - 48;  53 // 此時只有分,加單位str3【1】
 54             re1 +=str1[num] + str3[1];  55  }  56         return re1;  57  }  58     
 59 // 把一個四位的數字字符串變成漢字字符串
 60     private String toStr(String zheng)  61  {  62         String re = "" ;  63         int j = 0;  64         int lenz = zheng.length();  65 // 特殊情況如輸入0.89時,整數字符串為0的處理
 66         if(zheng.charAt(0)=='0'&&lenz==1)  67  {  68             re +="零";  69             return re;  70  }  71 // 遍歷每一位數字
 72         for(int i =0;i<lenz;i++)  73  {  74             int num = zheng.charAt(i) - 48;  75 // 若不是最后一位數字且數字不為零,則需要添加單位
 76             if(i!=lenz-1&&num!=0)  77  {  78                 re += str1[num]+str2[lenz-2-i];  79  }  80 // 對於連續0出現的特殊處理,如1009,第二個零不進行操作
 81             else if(!(num==0&&re.charAt(j-1)=='零'))  82  {  83                 re += str1[num];  84  }  85             j = re.length();  86  }  87 // 對特殊情況最后一位是零的處理,如1990,刪除掉末尾的零
 88         if(re.charAt(j-1)=='零')  89  {  90             re = re.substring(0, j-1);  91  }  92         return re;  93  }  94 // 對於金額的整數部分在12位數以內的處理,以4位數為一組,  95 // 如1234(億),5678(萬),1234(元).89,
 96     private String zhengDivade(String zheng)  97  {  98         int len = zheng.length();  99         String Re = ""; 100         int n = 0; 101 // 判斷整數部分的長度,考慮需要分幾個組
102         if(len>=9) 103             n = 3; 104         else if(len>=5) 105             n = 2; 106         else if(len>=1) 107             n = 1; 108 // 若位數非4的倍數,則在前面補0,直到位數為4的倍數為止 109 // 如 12,2345補為0012,2345
110         if(len%4!=0) 111  { 112             String zh = ""; 113             int s = len%4; 114 // 在前面補0
115             for(int k=0;k<(4-s);k++) 116  { 117                 zh += "0"; 118  } 119             zh += zheng; 120             zheng = zh; 121  } 122 // 進行n個組合的串聯 123 // 進行n次循環
124         for(int i=0;i<n;i++) 125  { 126            String Zheng = ""; 127            String sss =""; 128 // 長度在變化
129            len = zheng.length(); 130 // 提取出整數部分后四位,進行分開的轉換
131            Zheng = zheng.substring(len-4); 132 // 除去已經提取的字符串以外的字符串,字符串更新
133            zheng = zheng.substring(0, len-4); 134            int m =0,me=0; 135 // 把字符串轉換成整形數,如 0012換成12
136            for(int j=3;j>=0;j--) 137  { 138                m =(int) ((Zheng.charAt(j)-48)*Math.pow(10, 3-j)); 139                me += m; 140  } 141 // 把數字12裝換成字符串12
142            Zheng = String.valueOf(me); 143 // 把字符串12換成 壹拾貳
144            sss = this.toStr(Zheng); 145 // 銜接上 元 等單位,再加上已經轉換好的 漢字字符串 ,此處注意每組字符串間的順序
146            sss += str4[i]+Re; 147            Re = sss; 148  } 149       return Re; 150  } 151     
152 // 主方法,輸入金額,並將整數部分和小數部分聯接 
153     public static void main(String[] args) { 154         // TODO Auto-generated method stub
155        Rmb s = new Rmb(); 156        System.out.println("請輸入整數部分為十二位以內的金額:"); 157        Scanner in = new Scanner(System.in); 158        double a = in.nextDouble(); 159        System.out.println("人民幣讀法為:"); 160 // 將整數部分的漢字字符串和小數部分的漢字字符串聯接
161        System.out.println(s.zhengDivade(s.divadeZheng(a))+s.toStr1(s.divadeXiao(a))); 162  } 163 
164 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM