1. 程式人生 > >編寫一個程式,將浮點數轉換成人民幣讀法字串

編寫一個程式,將浮點數轉換成人民幣讀法字串

package crazy.lee.chapter04;

import java.util.Arrays;
/**
 * 
 * @author Windy46
 *
 */
public class Question05 {
    private String[] hanArr = {"零" , "壹" , "貳" , "叄" , "肆" ,
            "伍" , "陸" , "柒" , "捌" , "玖"};
        private String[] unitArr = {"十" , "百" , "千","萬","十","百","千","億","十"};
        private String[] doubleArr = {"分" , "角"};

        /**
         * 把一個浮點數分解成整數部分和小數部分字串
         * @param num 需要被分解的浮點數
         * @return 分解出來的整數部分和小數部分。第一個陣列元素是整數部分,第二個陣列元素是小數部分。
         */
        private  String[] divide(double num)
        {
            // 將一個浮點數強制型別轉換為long,即得到它的整數部分
            long zheng = (long)num;
            // 浮點數減去整數部分,得到小數部分,小數部分乘以100後再取整得到2位小數
            long xiao = Math.round((num - zheng) * 100);
            // 下面用了2種方法把整數轉換為字串
            return new String[]{zheng + "", String.valueOf(xiao)};
        }

        /**
         * 把一個四位的數字字串變成漢字字串
         * @param numStr 需要被轉換的四位的數字字串
         * @return 四位的數字字串被轉換成的漢字字串。
         */
        private String toHanStr(String numStr)
        {
            String result = "";
            int numLen = numStr.length();
            // 依次遍歷數字字串的每一位數字
            for (int i = 0 ; i < numLen ; i++ )
            {
                // 把char型數字轉換成的int型數字,因為它們的ASCII碼值恰好相差48
                // 因此把char型數字減去48得到int型數字,例如'4'被轉換成4。
                int num = numStr.charAt(i) - 48;
                // 如果不是最後一位數字,而且數字不是零,則需要新增單位(千、百、十)
                if ( i != numLen - 1 & num != 0)
                {
                    //按照中文讀法10讀成十,所以壹要省略,要新增單位但不用新增數字
                    if(result.lastIndexOf("壹")==result.length()-1&unitArr[numLen - 2 - i]=="十"){
                        result +=unitArr[numLen - 2 - i];
                        continue;
                    }
                    result += hanArr[num] + unitArr[numLen - 2 - i];
                }
                //我們中文讀法都是以4個位來讀的,如果當前位數為零,但是一個萬位,則需要新增萬單位
                else if (num == 0 & i<numLen - 2&&unitArr[numLen - 2 - i]=="萬")//190200 1000000
                {
                    //如果這個萬位的前一位是零,要把零去掉,因為沒有零萬的讀法 
                    if(result.endsWith("零")) 
                        result=result.substring(0, result.length()-1);                        
                    result +=unitArr[numLen - 2 - i];
                }
                //當前最後一位為零,當前數字為零,直接到下一個迴圈
                else if(result.lastIndexOf("零")==result.length()-1&num==0){
                    continue;
                }
                // 否則不要新增單位
                else
                {
                    result += hanArr[num];
                }
            }
            if(result.lastIndexOf("零")==result.length()-1) {
                result=result.substring(0, result.length()-1);
            }
            return result;
        }
        private String toDoubleStr(String numStr)
        {
            String result = "";
            int numLen =2;
            // 依次遍歷數字字串的每一位數字
            for (int i = 0 ; i < numLen ; i++ )
            {
                // 把char型數字轉換成的int型數字,因為它們的ASCII碼值恰好相差48
                // 因此把char型數字減去48得到int型數字,例如'4'被轉換成4。
                int num = numStr.charAt(i) - 48;
                // 如果不是最後一位數字,而且數字不是零,則需要新增單位(角、分)
                if ( i != numLen - 1 & num != 0)
                {
                    result += hanArr[num] + doubleArr[numLen-1-i];
                }
                //當前最後一位為零,當前數字為零,直接到下一個迴圈
                else if(result.lastIndexOf("零")==result.length()-1&num==0){
                    continue;
                }
                //是最後一位數字,而且數字不是零
                else if( i == numLen - 1 & num != 0){
                    result += hanArr[num] + doubleArr[numLen-1-i];
                }
                // 否則不要新增單位
                else
                {
                    result += hanArr[num];
                }
            }
            if(result.lastIndexOf("零")==result.length()-1) {
                result=result.substring(0, result.length()-1);
            }
            return result;
        }
        public  String printlnHan(Double num) {
            String[] str=this.divide(num);
            String result="";
            result=toHanStr(str[0])+toDoubleStr(str[1]);
            return result;
        }
        public static void main(String[] args)
        {
             Question05 nr = new  Question05();
            // 測試把一個浮點數分解成整數部分和小數部分
            System.out.println(Arrays.toString(nr.divide(236711125.123)));
            System.out.println(nr.printlnHan(236711125.123));
            // 測試把一個四位的數字字串變成漢字字串
            System.out.println(nr.toHanStr("1900200"));
            System.out.println(nr.toHanStr("18010")); 
            System.out.println(nr.toHanStr("1000001")); 
            System.out.println(nr.toDoubleStr("033")); 
        }
}

吐槽:

程式碼比較混亂,還沒有重構,裡面的if語句也很多,有必要需要改進

但是邏輯思維什麼的真的想了好久,是值得深究的一個功能

而且現在測出來暫時沒有錯誤(應該是十億範圍內),不代表之後可能不會有,需要再搞清一下邏輯

結果: