Java浮點數轉人民幣讀法

來源:互聯網
上載者:User

Java浮點數轉人民幣讀法

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));
    }
}

本文永久更新連結地址:https://www.bkjia.com/Linux/2018-03/151275.htm

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.