java人民币读法转换
實現浮點數轉換成人民幣讀法字符串
將浮點數轉換成人民幣讀法字符串,
例如: 將1006.333轉換為壹千零陸元叁角叁分。
整體解析:
將浮點數分成整數部分和小數部分,分開處理整數部分和小數部分。
小數部分的處理比較簡單,截取保留兩位數字,并將其轉換成幾角幾分的字符串即可。
整數部分可以以4位數字分為幾個數組,每一個4位數字都是幾千幾百幾十幾(添加適當的單位)。
這4位數字若出現在14位,則后面添加‘元’,若出現在58位,則添加‘萬’,若出現在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,則需單獨進行轉換操作。
import java.util.Arrays; import java.util.Scanner;// 編寫一個程序,將浮點數轉換成人民幣讀法字符串,例如,將1006.333轉換為壹千零陸元叁角叁分public class Rmb {private String[] str1 = {"零","壹","貳","叁","肆","伍","陸","柒","捌","玖"};private String[] str2 = {"十","百","千"};private String[] str3 = {"角","分"};private String[] str4 = {"元","萬","億"}; // 把浮點數分解成整數部分字符串private String divadeZheng(double num){ long zheng = (long)num; // 整型轉換成字符串return zheng + ""; } // 把浮點數分解成小數部分字符串private String divadeXiao(double num){long zheng = (long)num; // 得到浮點數的小數部分long xiao = Math.round((num-zheng)*100); // 用方法把整型轉換成字符串return String.valueOf(xiao);}// 把小數部分的數字字符串轉換成漢字字符串private String toStr1(String xiao){String re1 = "";int len = xiao.length();if(len==2){for(int i = 0;i<2;i++){ // 把字符串轉換成數字int num = xiao.charAt(i) - 48; // 數字不為零則需要加單位,為零則不操作if(num!=0){re1 += str1[num] + str3[i];}}} // 若長度為1,例:12.09小數部分為9if(len==1&&xiao.charAt(0)!='0'){int num = xiao.charAt(0) - 48; // 此時只有分,加單位str3【1】re1 +=str1[num] + str3[1];}return re1;}// 把一個四位的數字字符串變成漢字字符串private String toStr(String zheng){String re = "" ;int j = 0;int lenz = zheng.length(); // 特殊情況如輸入0.89時,整數字符串為0的處理if(zheng.charAt(0)=='0'&&lenz==1){re +="零";return re;} // 遍歷每一位數字for(int i =0;i<lenz;i++){int num = zheng.charAt(i) - 48; // 若不是最后一位數字且數字不為零,則需要添加單位if(i!=lenz-1&&num!=0){re += str1[num]+str2[lenz-2-i];} // 對于連續0出現的特殊處理,如1009,第二個零不進行操作else if(!(num==0&&re.charAt(j-1)=='零')){re += str1[num];}j = re.length();} // 對特殊情況最后一位是零的處理,如1990,刪除掉末尾的零if(re.charAt(j-1)=='零'){re = re.substring(0, j-1);}return re;} // 對于金額的整數部分在12位數以內的處理,以4位數為一組, // 如1234(億),5678(萬),1234(元).89,private String zhengDivade(String zheng){int len = zheng.length();String Re = ""; int n = 0; // 判斷整數部分的長度,考慮需要分幾個組if(len>=9)n = 3; else if(len>=5)n = 2;else if(len>=1)n = 1; // 若位數非4的倍數,則在前面補0,直到位數為4的倍數為止 // 如 12,2345補為0012,2345if(len%4!=0){String zh = "";int s = len%4; // 在前面補0for(int k=0;k<(4-s);k++){zh += "0";}zh += zheng;zheng = zh;} // 進行n個組合的串聯 // 進行n次循環for(int i=0;i<n;i++){String Zheng = ""; String sss =""; // 長度在變化len = zheng.length(); // 提取出整數部分后四位,進行分開的轉換Zheng = zheng.substring(len-4); // 除去已經提取的字符串以外的字符串,字符串更新zheng = zheng.substring(0, len-4);int m =0,me=0; // 把字符串轉換成整形數,如 0012換成12for(int j=3;j>=0;j--){m =(int) ((Zheng.charAt(j)-48)*Math.pow(10, 3-j));me += m;} // 把數字12裝換成字符串12Zheng = String.valueOf(me); // 把字符串12換成 壹拾貳sss = this.toStr(Zheng); // 銜接上 元 等單位,再加上已經轉換好的 漢字字符串 ,此處注意每組字符串間的順序sss += str4[i]+Re;Re = sss;}return Re; }// 主方法,輸入金額,并將整數部分和小數部分聯接 public static void main(String[] args) {// TODO Auto-generated method stubRmb s = new Rmb();System.out.println("請輸入整數部分為十二位以內的金額:");Scanner in = new Scanner(System.in);double a = in.nextDouble();System.out.println("人民幣讀法為:"); // 將整數部分的漢字字符串和小數部分的漢字字符串聯接System.out.println(s.zhengDivade(s.divadeZheng(a))+s.toStr1(s.divadeXiao(a)));}}總結
以上是生活随笔為你收集整理的java人民币读法转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java转换流
- 下一篇: C++ 移动和获取文件读写指针