天天看點

工具篇——MoneyFormatUtil(用于将人民币小寫金額轉換成大寫金額)代碼如下:在項目中的應用:

寫代碼的四點:      1.明确需求。要做什麼?      2.分析思路。要怎麼做?(1,2,3……)      3.确定步驟。每一個思路要用到哪些語句、方法和對象。      4.代碼實作。用具體的語言代碼将思路實作出來。   學習新技術的四點:      1.該技術是什麼?      2.該技術有什麼特點?(使用需注意的方面)      3.該技術怎麼使用?(寫Demo)      4.該技術什麼時候用?(在Project中的使用場景 )  

----------------------早計劃,早準備,早完成。-------------------------

代碼如下:

package com.wy.test.other;

/**
 * 人民币格式化工具
 * 用于将人民币小寫金額轉換成大寫金額
 * 要點:1.區分金額是整數還是小數,需要分開處理;
 *       2.将金額數字倒序,便于同機關合并
 *       3.異常處理,判斷數字中是否含有非法字元,有則return;
 *       4.數字中0的處理;
 */
public class MoneyFormatUtil {
    //機關
    private static final char[] UNIT = {'億', '拾', '佰', '仟', '萬', '拾', '佰', '仟'};
    //大寫金額模闆
    private static final char[] TEMPLATE = {'零', '壹', '貳', '叁', '肆', '伍', '陸', '柒', '捌', '玖'};

    private String submoneyCN[] = {"", "拾", "佰", "仟"};                                    //表示數字位數的數組
    private String numberCNN[] = {"零", "壹", "貳", "叁", "肆", "伍", "陸", "柒", "捌", "玖"};    //大寫數字的數組
    private static MoneyFormatUtil instance;

    /**
     * 擷取類的執行個體
     *
     * @return 類的執行個體
     */
    public static MoneyFormatUtil getInstance() {
        if (instance == null) {
            instance = new MoneyFormatUtil();
        }
        return instance;
    }

    /**
     * 将人民币小寫金額轉換成大寫金額
     *
     * @return 轉換後的大寫金額
     */
    public String convert(String money) {
        String formatCN = "";
        int point = money.indexOf(".");                //判斷字元串是否包含小數點(不包含傳回-1)
        if (point != -1) {//包含小數點的情況
            formatCN = decimalConversion(money, point);
        } else {
            formatCN = integerConversion(money);
        }
        return formatCN;
    }

    /**
     * 小數轉換
     *
     * @param decimalString 小數字元串(例:1234567.89  壹佰貳拾叁萬肆仟伍佰陸拾柒元捌角玖分)
     * @param pointPosition 小數點在字元串中的位置
     * @return 轉換後的大寫金額
     */
    private String decimalConversion(String decimalString, int pointPosition) {
        String formatDecimalString = "";
        String money1 = decimalString.substring(0, pointPosition);    //小數點之前的部分
        String money1_1 = (new StringBuffer(money1).reverse()).toString();//字元串倒序
        String money2 = decimalString.substring(pointPosition + 1);    //小數點之後的部分

        //異常處理
        for (int i = 0; i < money1.length(); i++) {
            if (!Character.isDigit(money1.charAt(i))) {
                return "數字中含有非法字元";
            }
        }
        for (int i = 0; i < money2.length(); i++) {
            if (!Character.isDigit(money2.charAt(i))) {
                return "數字中含有非法字元";
            }
        }

        if (money2.length() < 2) {                    //如果小數點後的部分少于兩位,用"0"補齊
            if (money2.length() == 0) {
                money2 = "00";
            } else {
                money2 += "0";
            }
        } else {
            //如果小數點後的位數大于2位,則隻前2位
            money2 = decimalString.substring(pointPosition + 1, pointPosition + 3);
        }
        int len = money1_1.length();            //字元串反轉之後,小數點之前的字元位數
        int pos = len - 1;
        String sigle = "";
        boolean allhavenum = false;
        boolean havenum = false;
        boolean mark = false;                    //設定一個開關變量,若目前數為"0",将該值設為true;不為"0"時設為false
        /**以下代碼為讀出小數點左面的部分*/
        while (pos >= 0) {
            sigle = money1_1.substring(pos, pos + 1);//截取1位數字,比如數字1234.56,将左側的字元串反轉,值為4321,則截取的值為1

            /**讀取“億單元”的代碼。
             * 假設讀取10024531042.34。
             * 小數點左面反轉後為:24013542001
             * pos的初始值為10
             * mark的初始值為false
             * havenum的初始值為false
             * */
            if (pos >= 8 && pos < 12) {
                if (!sigle.equals("0")) {         //如果目前值不為"0"
                    if (!mark) {                 //如果目前值的前一位數不為"0"
                        formatDecimalString += numberCNN[Integer.parseInt(sigle)] + submoneyCN[pos % 4];
                    } else {                         //如果目前值不為"0",但該值的前一位數為"0"
                        if (allhavenum) {             //如果在目前值之前有不為"0"的數字出現。該條件用來處理使用者輸入的如:0012.34的數值
                            formatDecimalString += "零";
                        }
                        formatDecimalString += numberCNN[Integer.parseInt(sigle)] + submoneyCN[pos % 4];
                        mark = false;
                    }
                    havenum = true;
                    allhavenum = true;            //變量allhavenum表示小數點左面的數中是否有不為"0"的數字;true表示有,false表示無
                } else {                            //如果目前值為"0"
                    mark = true;
                }
                if (pos % 4 == 0 && havenum) {            //如果目前數字為該單元的最後一位,并且該單元中有不為"0"的數字出現
                    formatDecimalString += "億";
                    havenum = false;
                }
            }
            /**讀取“萬單元”的代碼*/
            if (pos >= 4 && pos < 8) {
                if (!sigle.equals("0")) {
                    if (!mark) {
                        formatDecimalString += numberCNN[Integer.parseInt(sigle)] + submoneyCN[pos % 4];
                    } else {
                        if (allhavenum) {
                            formatDecimalString += "零";
                        }
                        formatDecimalString += numberCNN[Integer.parseInt(sigle)] + submoneyCN[pos % 4];
                        mark = false;
                    }
                    havenum = true;
                    allhavenum = true;
                } else {
                    mark = true;
                }
                if (pos % 4 == 0 && havenum) {
                    formatDecimalString += "萬";
                    havenum = false;
                }
            }
            /**讀取“個、十、百、千”的代碼*/
            if (pos >= 0 && pos < 4) {
                if (!sigle.equals("0")) {
                    if (!mark) {
                        formatDecimalString += numberCNN[Integer.parseInt(sigle)] + submoneyCN[pos % 4];
                    } else {
                        if (allhavenum) {
                            formatDecimalString += "零";
                        }
                        formatDecimalString += numberCNN[Integer.parseInt(sigle)] + submoneyCN[pos % 4];
                        mark = false;
                    }
                    havenum = true;
                    allhavenum = true;
                } else {
                    mark = true;
                }
            }
            pos--;
        }
        /**碰到小數點時的讀法*/
        if (allhavenum) { //如:00.34就不能讀為:元3角4分.變量allhavenum表示小數點左面的内容中是否有數字出現
            formatDecimalString += "元";
        } else {//如果小數點左面的部分都為0如:00.34應讀為:零元3角4分
            formatDecimalString = "零元";
        }
        /**以下代碼為讀出小數點右面的部分 */
        if (money2.equals("00")) {
            formatDecimalString += "整";
        } else {
            /**讀出角,如120.34讀為:1佰2拾元零3角4分;123.04讀為:1佰2拾3元零4分*/
//                if(money2.startsWith("0")||(allhavenum&&money1.endsWith("0"))){
//                    formatCN+="零";
//                }
            if (!money2.startsWith("0")) {
                formatDecimalString += numberCNN[Integer.parseInt(money2.substring(0, 1))] + "角";
            }
            //讀出分,如:12.30讀1拾2元3角零分
            formatDecimalString += numberCNN[Integer.parseInt(money2.substring(1))] + "分";
        }

        return formatDecimalString;
    }

    /**
     * 整數轉換
     *
     * @param integerString 整數字元串(例:123456789   壹億貳仟叁佰肆拾伍萬陸仟柒佰捌拾玖元整)
     * @return 轉換後的大寫金額
     */
    private String integerConversion(String integerString) {
        //用來存放轉換後的大寫數字,因為是StringBuffer類型,是以順便把沒有轉換
        //的數字倒序排列一下,省一個變量.
        StringBuffer ChineseCharI = new StringBuffer(integerString);
        //倒序的數字,便于同機關合并
        String rintString = ChineseCharI.reverse().toString();
        //清空一下
        ChineseCharI.delete(0, ChineseCharI.length());
        //機關索引
        int unitIndex = 0;
        //數字長度
        int intStringLen = integerString.length();
        //一位由字元轉換的數字
        int intStringnumber = 0;
        //補0
        boolean addZero = false;
        boolean flagZero = false;
        for (int i = 0; i < intStringLen; i++) {
            //按機關長度循環索引
            unitIndex = i % UNIT.length;

            //異常處理
            if (!Character.isDigit(rintString.charAt(i))) {
                return "數字中含有非法字元";
            }
            //将字元轉為數字,範圍為10以内(不包括10,超出則傳回-1)
            intStringnumber = Character.digit(rintString.charAt(i), 10);

            //如果目前位是0,開啟補0繼續循環直到不是0的位
            if (intStringnumber == 0) {
                addZero = true;
                if (i != 0 && i % 4 == 0) {
                    if (addZero && ChineseCharI.length() != 0) {
                        ChineseCharI.append(TEMPLATE[0]);
                        addZero = false;
                    }
                    flagZero = true;
                    ChineseCharI.append(UNIT[unitIndex]);
                }
            } else {
                //若目前位不是第一位且補0開啟
                if (addZero && ChineseCharI.length() != 0 && !flagZero) {
                    ChineseCharI.append(TEMPLATE[0]);
                }
                flagZero = false;
                //插入機關
                //個位數後面不需要機關
                if (i > 0) {
                    ChineseCharI.append(UNIT[unitIndex]);
                }

                //插入大寫數字
                ChineseCharI.append(TEMPLATE[intStringnumber]);
                //補0關閉
                addZero = false;
            }
        }

        //異常處理
        if (ChineseCharI.length() == 0) {
            return "零";
        }
        return ChineseCharI.reverse().toString() + "元整";
    }
}
           

在項目中的應用:

String convert = MoneyFormatUtil.getInstance().convert("1234567.89");
String convert1 = MoneyFormatUtil.getInstance().convert("1.34");
String convert2 = MoneyFormatUtil.getInstance().convert("100.34");
String convert3 = MoneyFormatUtil.getInstance().convert("34f5460.34");
String convert4 = MoneyFormatUtil.getInstance().convert("10000.34");
String convert5 = MoneyFormatUtil.getInstance().convert("100000.34f");
String convert6 = MoneyFormatUtil.getInstance().convert("1003430000.34");
String convert7 = MoneyFormatUtil.getInstance().convert("1101010101.34");
String convert8 = MoneyFormatUtil.getInstance().convert("1010101010.34"
           

---------------------------------------------------------------------------------------------------------------------------

早計劃,早準備,早完成。 歡迎關注!交流!Star!

GitHub:https://github.com/wangyang0313

微信公衆号:一個靈活的胖子MrWang

簡書:https://www.jianshu.com/u/e5e733d79b96  

工具篇——MoneyFormatUtil(用于将人民币小寫金額轉換成大寫金額)代碼如下:在項目中的應用: