實現浮點數轉換成人民幣讀法字符串
編寫一個程序,將浮點數轉換成人民幣讀法字符串,
例如: 將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 }