金額的數字轉漢字的方法

import org.junit.Test;

public class Testzh {

    private static String HanDigiStr[] = new String[] { "零", "壹", "貳", "叄",
            "肆", "伍", "陸", "柒", "捌", "玖" };

    private static String HanDiviStr[] = new String[] { "", "拾", "佰", "仟", "萬",
            "拾", "佰", "仟", "億", "拾", "佰", "仟", "萬", "拾", "佰", "仟", "億", "拾",
            "佰", "仟", "萬", "拾", "佰", "仟" };
    @Test
    public void PositiveIntegerToHanStr() {
        String NumStr= "123456";
        // 輸入字符串必須正整數,只允許前導空格(必須右對齊),不宜有前導零
        String RMBStr = "";
        boolean lastzero = false;
        boolean hasvalue = false; // 億、萬進位前有數值標記
        int len, n;
        len = NumStr.length();
        if (len > 15)
            System.out.println("數值過大!");
        for (int i = len - 1; i >= 0; i--) {
            if (NumStr.charAt(len - i - 1) == ' ')
                continue;
            n = NumStr.charAt(len - i - 1) - '0';
            if (n < 0 || n > 9)
                System.out.println("輸入含非數字字符!");

            if (n != 0) {
                if (lastzero)
                    RMBStr += HanDigiStr[0]; // 若干零後若跟非零值,只顯示一個零
                // 除了億萬前的零不帶到後面
                // if( !( n==1 && (i%4)==1 && (lastzero || i==len-1) ) )
                // 如十進位前有零也不發壹音用此行
                if (!(n == 1 && (i % 4) == 1 && i == len - 1)) // 十進位處於第一位不發壹音
                    RMBStr += HanDigiStr[n];
                RMBStr += HanDiviStr[i]; // 非零值後加進位,個位爲空
                hasvalue = true; // 置萬進位前有值標記

            } else {
                if ((i % 8) == 0 || ((i % 8) == 4 && hasvalue)) // 億萬之間必須有非零值方顯示萬
                    RMBStr += HanDiviStr[i]; // “億”或“萬”
            }
            if (i % 8 == 0)
                hasvalue = false; // 萬進位前有值標記逢億復位
            lastzero = (n == 0) && (i % 4 != 0);
        }

        if (RMBStr.length() == 0)
            System.out.println(HanDigiStr[0]);
        System.out.println(RMBStr);
    }

    @Test
    public void numToRMBStr() {
        Double val = 123456.34;
        String SignStr = "";
        String TailStr = "";
        long fraction, integer;
        int jiao, fen;

        if (val < 0) {
            val = -val;
            SignStr = "負";
        }
        if (val > 99999999999999.999 || val < -99999999999999.999)
            System.out.println("數值位數過大!");
        // 四捨五入到分
        long temp = Math.round(val * 100);
        integer = temp / 100;
        fraction = temp % 100;
        jiao = (int) fraction / 10;
        fen = (int) fraction % 10;
        if (jiao == 0 && fen == 0) {
            TailStr = "整";
        } else {
            TailStr = HanDigiStr[jiao];
            if (jiao != 0)
                TailStr += "角";
            // 零元后不寫零幾分
            if (integer == 0 && jiao == 0)
                TailStr = "";
            if (fen != 0)
                TailStr += HanDigiStr[fen] + "分";
        }
        // 下一行可用於非正規金融場合,0.03只顯示“叄分”而不是“零元叄分”
        // if( !integer ) return SignStr+TailStr;
        System.out.println(SignStr + "拾貳萬叄仟肆佰伍拾陸" + "元" + TailStr);
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章