【java】java處理隨機浮點數(小數點后兩位)用RMB的大寫數值規則輸出


晚上上床前,拿到這個有意思的問題,就想玩弄一番:

============================================================================

規則:【隨機浮點數按照RMB讀法寫出】

總代碼如下:

package com.sxd.test;

import org.junit.Test;

import java.text.DecimalFormat;
import java.util.Random;

/**
 * @Author  SXD
 */
public class RandomTest {

    @Test
    public void createRandom(){
        DecimalFormat df = new DecimalFormat("0.00");
        Random random = new Random();
        double aa = (random.nextDouble())*(random.nextInt(Integer.MAX_VALUE));
        System.out.println(df.format(aa));
        System.out.println(deal4RMB(df.format(aa)));
    }

    /**
     * 從小數點為分界線,往前迭代處理+往后拼接角分+部分規則
     * @param dbNum 隨機浮點數值
     * @return  轉化后的RMB大寫數值描述
     */
    private String deal4RMB(String dbNum){
        String sb = "";
        try {
            int point = dbNum.lastIndexOf(".");
            char [] charArr = dbNum.toCharArray();
            for (int i = 1; i <= point; i++) {
                String flag = getUpperCase(charArr[point-i],i);
                sb = flag + sb ;
                if("error".equals(flag)){
                    return  "轉化異常";
                }
            }
            sb = dealString(sb);
            sb = sb+"元"+getUpperCase(charArr[point+1],-1)+getUpperCase(charArr[point+2],-2);
        }catch (Exception e){
            System.out.println(e);
            return  "轉化異常";
        }
            return  sb;
    }

    /**
     * 替換中文RMB計數 + 部分規則
     * @param a 數值
     * @param i 位置
     * @return  數值+位置
     */
    private String getUpperCase(char a,int i){
        //本位值為0  並且 本位位置在個位   小數點后一位  小數點后兩位
        //不做任何返回操作
        if('0' == a && (i==1 || i==-1 || i==-2)){
            return "";
        }
        //本位值為0 並且 本位位置在萬位
        //僅返回 萬  而不是幾萬
        if ('0' == a && i==5) {
            return "萬";
        }

        //本位數字轉化的漢字大寫數字
        String flag = "";
        //本位位置對應 【分 角 個 十 百 千  萬  億】 
        String flag2 = "";
        
        switch (a){
            case '0' : flag = "零";break;
            case '1' : flag = "壹";break;
            case '2' : flag = "貳";break;
            case '3' : flag = "叄";break;
            case '4' : flag = "肆";break;
            case '5' : flag = "伍";break;
            case '6' : flag = "陸";break;
            case '7' : flag = "柒";break;
            case '8' : flag = "捌";break;
            case '9' : flag = "玖";break;

            default : flag = "error";
        }

        //本位為零  不拼接本位位置 【除萬位  上方已經單獨處理】
        if(!"零".equals(flag)){
            switch (i){
                case -1: flag2 = "角";break;
                case -2: flag2 = "分";break;
                case 2:
                case 6:
                case 10: flag2 = "十";break;

                case 3:
                case 7:
                case 11: flag2 = "百";break;

                case 4:
                case 8: flag2 =  "千";break;

                case 5: flag2 = "萬";break;
                case 9: flag2 = "億";break;

                default: flag2 = "";
            }
        }
        
        
        /**
         * 本處處理未完善
         *因為隨機數 Integer位數達到10位以上的概率很大
         *因此處理時僅處理了 壹十貳億幾千幾百萬 這種情況
         *若隨機數級別在十萬位 依舊會出現  壹十幾萬幾千幾百
         *若隨機數級別在十位   依舊會出現  壹十幾點幾情況
         * 
         * 若要完全處理,僅需要先判斷隨機數總位數,而后再判斷i的值為第幾位再特殊處理即可~~
         */
        if("壹".equals(flag) && "十".equals(flag2) && i == 10){
            return  flag2;
        }

        //返回 數值+位置
        return flag+flag2;
    }


    /**
     * 去除重復零  + 部分規則
     * @param rmbStr
     * @return
     */
    private String dealString(String rmbStr){
       while(rmbStr.indexOf("零零") >= 0){
           rmbStr = rmbStr.replace("零零","零");
       }
       
       //判斷個位是否依舊為零 若為零  截取字符串即可
       char [] arr = rmbStr.toCharArray();
       if('零' == arr[arr.length-1]){
           rmbStr = rmbStr.substring(0,rmbStr.length()-1);
       }
       return rmbStr;
    }

}
View Code

 

效果展示:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM