1. 程式人生 > >Java浮點數轉人民幣讀法

Java浮點數轉人民幣讀法

pri HR long 分解 個數 統一處理 得到 ngs i++

Java浮點數轉人民幣讀法

  • 把【整數部分】的數字,由個位開始,4個數字分為一組,最高位沒有數字就補0,並記錄總共的數組個數,總共有3組,也就3*4的二維數組;
  • 對於每個數組統一處理,最後將最開頭的“零去掉”,將“億”、“萬”“元”字前面的“零”去掉;
  • 當讀取到0時,檢查它的上一位是否為0,如果上一位是0,則不做處理,如果上一位不是0或者上一位不存在,均記下“零”;
  • 讀取每個數字,轉換為對應的大寫漢字,並加上權重“仟、佰、拾”,根據讀取的是第幾個數組,後面添加相應的“億”、“萬”“元”;
  • 把【小數部分】做一維數組處理,僅保留兩位小數,對應“角”和“分”,數字0不處理;


測試數字『120, 3005, 7600.89』,讀作:壹佰貳拾億叁仟零伍萬柒仟陸佰元捌角玖分。
package
theTest; public class NumToRmb { private String[] hanArr={"零","壹","貳","叁","肆","伍","陸","柒","捌","玖"}; private String[] unitArr={"仟","佰","拾"}; /** * 把一個浮點數分解成整數部分和小數部分字符串 * @param num 需要被分解的浮點數 * @return 分解出來的整數部分和小數部分,第1個數組元素是整數部分,第2個數組元素是小數部分。
*/ private String[] divide(double num){ //將一個浮點數強制轉換為long型,即得到它的整數部分 long zheng=(long)num; //浮點數減去整數部分,得到小數部分,小數部分乘以100取整得到兩位小數 long xiao=Math.round((num-zheng)*100); //這裏使用兩種方法將整數轉換為字符串 return new String[]{String.valueOf(zheng),xiao+""}; }
/** * 將整數分成4個數字為一組的字符串處理,轉化成大寫數字再將它們連接起來,得到最終的人民幣讀法 * @param num 需要被轉化為大寫數字的浮點數 * @return 返回整個數字的人民幣讀法 */ private String conHanStr(double num){ //存儲整數結果、小數結果 String resZheng=""; String resXiao=""; //存儲最終結果 String result=""; //分別存儲整數部分和小數部分字符串 String zhengStr=divide(num)[0]; String xiaoStr=divide(num)[1]; /*小數部分的處理*/ if(xiaoStr.length()==1){ xiaoStr="0"+xiaoStr; } resXiao=xiao2Han(xiaoStr); /*整數部分的處理*/ //記錄字符串個數,是第幾個數組 int countArr=0; String tempStr=""; //記錄位數 int countNum=0; for(int i=zhengStr.length()-1;i>=0;i--){ countNum++; tempStr=zhengStr.charAt(i)+tempStr; if(i-1<0){ //i已經是最後一個數字,不夠的位,補0 while(tempStr.length()<4){ tempStr="0"+tempStr; } countArr++; resZheng=zheng2Han(countArr,tempStr)+" "+resZheng; }else{ if(countNum==4){ countArr++; resZheng=zheng2Han(countArr,tempStr)+" "+resZheng; countNum=0; tempStr=""; } } } //去掉開頭的零 if(resZheng.charAt(0)==‘零‘){ resZheng=resZheng.substring(1,resZheng.length()); } /*整數和小數的連接*/ //表示整數部分為0 if(resZheng.charAt(0)==‘元‘){ resZheng="零"+resZheng; } result=resZheng+resXiao; return result; } /** * 每個4位的整數組轉化為大寫的數字 * @param count 記錄是第幾個數組(1-3) * @param str 需要被轉換的數組 * @return 返回該數組人民幣讀法 */ private String zheng2Han(int count,String str){ String result=""; for(int j=0;j<4;j++){ int tempNum=str.charAt(j)-48; if(tempNum!=0){ if(j!=3){ result+=hanArr[tempNum]+unitArr[j]; }else{ result+=hanArr[tempNum]; } }else{ if((j-1<0)||(str.charAt(j-1)-48!=0)){ result+=hanArr[tempNum]; } } } //去掉末尾的零 if(result.charAt(result.length()-1)==‘零‘){ result=result.substring(0, result.length()-1); } //去零之後添加“億、萬、元、角、分”。 switch(count){ case 1: result+="元"; break; case 2: result+="萬"; break; case 3: result+="億"; break; default: System.out.println("僅支持不大於9999,9999,9999.99的數字!"); return ""; } return result; } /** * 小數轉化為大寫的數字 * @param str 需要被轉換的數組 * @return 返回該小數人民幣讀法 */ private String xiao2Han(String str){ String result=""; if(!str.equals("00")){ for(int i=0;i<2;i++){ int tempNum=str.charAt(i)-48; if((tempNum!=0)&&(i==0)){ result+=hanArr[tempNum]+"角"; } if((tempNum!=0)&&(i==1)){ result+=hanArr[tempNum]+"分"; } } } return result; } /** * 主函數 * @param args */ public static void main(String[] args) { NumToRmb nr=new NumToRmb(); System.out.println(nr.conHanStr((double)12030060078.95)); } }

Java浮點數轉人民幣讀法