java人民币读法转换
實現(xiàn)浮點數(shù)轉(zhuǎn)換成人民幣讀法字符串
將浮點數(shù)轉(zhuǎn)換成人民幣讀法字符串,
例如: 將1006.333轉(zhuǎn)換為壹千零陸元叁角叁分。
整體解析:
將浮點數(shù)分成整數(shù)部分和小數(shù)部分,分開處理整數(shù)部分和小數(shù)部分。
小數(shù)部分的處理比較簡單,截取保留兩位數(shù)字,并將其轉(zhuǎn)換成幾角幾分的字符串即可。
整數(shù)部分可以以4位數(shù)字分為幾個數(shù)組,每一個4位數(shù)字都是幾千幾百幾十幾(添加適當(dāng)?shù)膯挝?#xff09;。
這4位數(shù)字若出現(xiàn)在14位,則后面添加‘元’,若出現(xiàn)在58位,則添加‘萬’,若出現(xiàn)在9~12位,則添加‘億’。
超過12位以后,暫不考慮,實際上,超過12位數(shù)后,double類型存儲溢出,會造成數(shù)據(jù)的錯誤。
程序解析:
將浮點數(shù)分成整數(shù)部分和小數(shù)部分字符串,只要把double型的浮點數(shù)強制轉(zhuǎn)換成long型即可得到整數(shù)部分,
將double型的浮點數(shù)減去long型的整數(shù)部分即可得到浮點數(shù)的小數(shù)部分,由于只需取兩位則乘以100,再用
Math.round函數(shù)取整得到小數(shù)部分。用“zheng+”“ ”或"String.valueOf(xiao)"將整數(shù)轉(zhuǎn)換為字符串。
將小數(shù)部分的字符串逐個進(jìn)行判斷,在其后面適當(dāng)?shù)脑黾咏恰⒎?#xff0c;即可轉(zhuǎn)換成功。
將整數(shù)部分的字符串補零,使其字符串長度成為4的倍數(shù),以便4位一組的分組。使用字符串截取函數(shù)截取后4
位的字符串,并使原字符串更新為除去后4位以后的字符串。
4位一組的字符串進(jìn)行漢字字符的轉(zhuǎn)換,若非最后一位數(shù)字且數(shù)字不為零,則需添加單位。
每四位的已轉(zhuǎn)換好的漢字字符串連接時需注意順序。
特殊情況:
若數(shù)字小數(shù)點后一位為0,如19.08,則需在小數(shù)部分轉(zhuǎn)換時考慮小數(shù)部分字符串的長度,若長度為1,則特殊處理。
若數(shù)字如10009所示,后四位截取后為0009,轉(zhuǎn)換時易出現(xiàn)錯誤,需將其轉(zhuǎn)換為字符串9后再將其進(jìn)行漢字字符的
轉(zhuǎn)換。
若數(shù)字如1009所示,2個零相鄰,則需對轉(zhuǎn)換時單個字符為0時的前一個字符進(jìn)行判斷,是否需要進(jìn)行轉(zhuǎn)換操作。
若數(shù)字如1890所示,最后一位為零,則需對轉(zhuǎn)換后的字符串進(jìn)行判斷最后一個字符是否為零,是否需要刪去。
若數(shù)字如0.89,或10000.89所示,截取的4位字符串位0,則需單獨進(jìn)行轉(zhuǎn)換操作。
import java.util.Arrays; import java.util.Scanner;// 編寫一個程序,將浮點數(shù)轉(zhuǎn)換成人民幣讀法字符串,例如,將1006.333轉(zhuǎn)換為壹千零陸元叁角叁分public class Rmb {private String[] str1 = {"零","壹","貳","叁","肆","伍","陸","柒","捌","玖"};private String[] str2 = {"十","百","千"};private String[] str3 = {"角","分"};private String[] str4 = {"元","萬","億"}; // 把浮點數(shù)分解成整數(shù)部分字符串private String divadeZheng(double num){ long zheng = (long)num; // 整型轉(zhuǎn)換成字符串return zheng + ""; } // 把浮點數(shù)分解成小數(shù)部分字符串private String divadeXiao(double num){long zheng = (long)num; // 得到浮點數(shù)的小數(shù)部分long xiao = Math.round((num-zheng)*100); // 用方法把整型轉(zhuǎn)換成字符串return String.valueOf(xiao);}// 把小數(shù)部分的數(shù)字字符串轉(zhuǎn)換成漢字字符串private String toStr1(String xiao){String re1 = "";int len = xiao.length();if(len==2){for(int i = 0;i<2;i++){ // 把字符串轉(zhuǎn)換成數(shù)字int num = xiao.charAt(i) - 48; // 數(shù)字不為零則需要加單位,為零則不操作if(num!=0){re1 += str1[num] + str3[i];}}} // 若長度為1,例:12.09小數(shù)部分為9if(len==1&&xiao.charAt(0)!='0'){int num = xiao.charAt(0) - 48; // 此時只有分,加單位str3【1】re1 +=str1[num] + str3[1];}return re1;}// 把一個四位的數(shù)字字符串變成漢字字符串private String toStr(String zheng){String re = "" ;int j = 0;int lenz = zheng.length(); // 特殊情況如輸入0.89時,整數(shù)字符串為0的處理if(zheng.charAt(0)=='0'&&lenz==1){re +="零";return re;} // 遍歷每一位數(shù)字for(int i =0;i<lenz;i++){int num = zheng.charAt(i) - 48; // 若不是最后一位數(shù)字且數(shù)字不為零,則需要添加單位if(i!=lenz-1&&num!=0){re += str1[num]+str2[lenz-2-i];} // 對于連續(xù)0出現(xiàn)的特殊處理,如1009,第二個零不進(jìn)行操作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;} // 對于金額的整數(shù)部分在12位數(shù)以內(nèi)的處理,以4位數(shù)為一組, // 如1234(億),5678(萬),1234(元).89,private String zhengDivade(String zheng){int len = zheng.length();String Re = ""; int n = 0; // 判斷整數(shù)部分的長度,考慮需要分幾個組if(len>=9)n = 3; else if(len>=5)n = 2;else if(len>=1)n = 1; // 若位數(shù)非4的倍數(shù),則在前面補0,直到位數(shù)為4的倍數(shù)為止 // 如 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;} // 進(jìn)行n個組合的串聯(lián) // 進(jìn)行n次循環(huán)for(int i=0;i<n;i++){String Zheng = ""; String sss =""; // 長度在變化len = zheng.length(); // 提取出整數(shù)部分后四位,進(jìn)行分開的轉(zhuǎn)換Zheng = zheng.substring(len-4); // 除去已經(jīng)提取的字符串以外的字符串,字符串更新zheng = zheng.substring(0, len-4);int m =0,me=0; // 把字符串轉(zhuǎn)換成整形數(shù),如 0012換成12for(int j=3;j>=0;j--){m =(int) ((Zheng.charAt(j)-48)*Math.pow(10, 3-j));me += m;} // 把數(shù)字12裝換成字符串12Zheng = String.valueOf(me); // 把字符串12換成 壹拾貳sss = this.toStr(Zheng); // 銜接上 元 等單位,再加上已經(jīng)轉(zhuǎn)換好的 漢字字符串 ,此處注意每組字符串間的順序sss += str4[i]+Re;Re = sss;}return Re; }// 主方法,輸入金額,并將整數(shù)部分和小數(shù)部分聯(lián)接 public static void main(String[] args) {// TODO Auto-generated method stubRmb s = new Rmb();System.out.println("請輸入整數(shù)部分為十二位以內(nèi)的金額:");Scanner in = new Scanner(System.in);double a = in.nextDouble();System.out.println("人民幣讀法為:"); // 將整數(shù)部分的漢字字符串和小數(shù)部分的漢字字符串聯(lián)接System.out.println(s.zhengDivade(s.divadeZheng(a))+s.toStr1(s.divadeXiao(a)));}}總結(jié)
以上是生活随笔為你收集整理的java人民币读法转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java转换流
- 下一篇: C语言中的文件是什么?