Java實現人民幣大寫精講

jopen 8年前發布 | 8K 次閱讀 Java Java開發

原文  http://www.cnblogs.com/tufujie/p/5081229.html

 

想要實現人民幣大寫,在發票等場景中使用?? 1234.56顯示為:壹仟貳佰叁拾肆元伍角陸分,那就往下看看吧!

本程序可以實現 0 到 9999 9999 9999.994 以內的人民幣大寫轉換,精確到分

經典測試數據:

0

希望轉換出來的結果為:

零元零角零分

</div>

1234

希望轉換出來的結果為:

壹仟貳佰叁拾肆元零角零分

</div>

9999

希望轉換出來的結果為:

玖仟玖佰玖拾玖元零角零分

</div>

1234.5

希望轉換出來的結果為:

壹仟貳佰叁拾肆元伍角零分

</div>

1234.9

希望轉換出來的結果為:

壹仟貳佰叁拾肆元玖角零分

</div>

1234.56

希望轉換出來的結果為:

壹仟貳佰叁拾肆元伍角陸分

</div>

1234.99

希望轉換出來的結果為:

壹仟貳佰叁拾肆元玖角玖分

</div>

1234.994

希望轉換出來的結果為:

壹仟貳佰叁拾肆元玖角玖分

</div>

1234.999

希望轉換出來的結果為:

壹仟貳佰叁拾伍元零角零分

</div>

999999999999.999

希望轉換出來的結果為:

數據過大,無法進行轉換,請重新輸入!

</div>

程序源碼如下,含注釋:

package com.tfj.algorithm;

import java.util.Scanner;

public class RenMingBi { private boolean zero; String[] strHan = { "零", "壹", "貳", "叁", "肆", "伍", "陸", "柒", "捌", "玖" }; String[] moneyCount = { "", "拾", "佰", "仟" };

RenMingBi() {
    zero = false;
}

private String[] divide(double digitalRmbValue) {
    // 處理整數
    long intPart = (long) (digitalRmbValue);
    // 處理小數,把小數轉換成整數形式處理,并進行四舍五入,此時小數四舍五入之后為100的應該另外加一層處理
    long decimalPart = Math
            .round((double) Math.round((digitalRmbValue - intPart) * 10000) / 100);
    // System.out.println("整數部分為:" + intPart + "小數部分為:" + (digitalRmbValue - intPart));
    if (decimalPart == 100) {
        intPart += 1;
    }
    // System.out.println("四舍五入之后整數部分為:" + intPart + "小數部分為:" + decimalPart);

    String strIntPart = "";
    if (intPart == 0)
        strIntPart = "0";
    else {
        strIntPart = "" + intPart;
    }

    String strDecimalPart = "";
    if (decimalPart < 10 && decimalPart >= 0)
        strDecimalPart = "0" + decimalPart;
    else {
        strDecimalPart = "" + decimalPart;
    }
    // 處理輸入為0的時候
    if (intPart == 0 && decimalPart == 0) {
        zero = true;
    }
    // System.out.println("準換為String后,整數部分為:" + strIntPart + "小數部分為:" + strDecimalPart);
    return new String[] { strIntPart, strDecimalPart };
}

// 用來轉換小數部分
private String transDecimal(String str) {
    if (str.equals("100") || str.equals("00")) {
        return "零角零分";
    } else {
        String strResult;
        char[] strRmb = new char[20];
        strRmb = str.toCharArray();
        if (strRmb[0] == '0' && strRmb[1] == '0') {
            strResult = "";
        } else {
            int dm = strRmb[0] - '0';
            int dn = strRmb[1] - '0';
            strResult = strHan[dm] + "角" + strHan[dn] + "分";
        }
        return strResult;
    }
}

// 用來轉換整數部分
private String transInt(String str) {
    char[] firstFourBitRmb = new char[20];
    firstFourBitRmb = str.toCharArray();
    int len = firstFourBitRmb.length;
    String strResult = "";
    for (int i = 0; i < len; i++) {
        /**
         * 這里開啟之后會顯示成通俗易懂的格式,例如1001,會轉化為:壹仟零壹元,而不是:壹仟零佰零拾壹元, 但我希望得到的是后面這種,因為發票所需顯示的就是后面這種
         **/

        // if (firstFourBitRmb[i] == '0' && i < len) {
        // boolean zeroFlag = false;
        // while (i < len && firstFourBitRmb[i] == '0') {
        // zeroFlag = true;
        // i++;
        // }
        // if (i != len && zeroFlag == true)
        // strResult += "零";
        // i--;
        // } else {
        // int m = firstFourBitRmb[i] - '0';
        // strResult += strHan[m] + moneyCount[len - i - 1];
        // }
        int m = firstFourBitRmb[i] - '0';
        strResult += strHan[m] + moneyCount[len - i - 1];
    }
    return strResult;
}

public String transComb() {
    String[] strTempRmb = new String[2];
    double strValue = 0D;
    Scanner sc = new Scanner(System.in);

    System.out.println("請輸入具體金額,結果會精確到分:");
    strValue = sc.nextDouble();
    RenMingBi nr = new RenMingBi();
    strTempRmb = nr.divide(strValue);
    // 轉換小數部分
    String result1 = nr.transDecimal(strTempRmb[1]);

    // 轉換整數部分
    String result2 = "";
    int len = strTempRmb[0].length();
    if (len > 12)
        return "數據過大,無法進行轉換,請重新輸入!";
    else {
        if (len >= 9) {
            String strBit1 = strTempRmb[0].substring(0, len - 8);
            String strBit2 = strTempRmb[0].substring(len - 8, len - 4);
            String strBit3 = strTempRmb[0].substring(len - 4, len);
            String strResult1 = nr.transInt(strBit1) + "億";
            String strResult2 = nr.transInt(strBit2) + "萬";
            String strResult3 = nr.transInt(strBit3) + "元";
            result2 = strResult1 + strResult2 + strResult3;
        } else if (len >= 5) {
            String strBit1 = strTempRmb[0].substring(0, len - 4);
            String strBit2 = strTempRmb[0].substring(len - 4, len);
            String strResult1 = nr.transInt(strBit1) + "萬";
            String strResult2 = nr.transInt(strBit2) + "元";
            result2 = strResult1 + strResult2;
        } else if (len >= 1) {
            if (nr.zero == true) {
                result2 = "零元";
            } else
                result2 = nr.transInt(strTempRmb[0]) + "元";
        }
        return result2 + result1;
    }
}

public static void main(String[] args) {
    RenMingBi rmb = new RenMingBi();
    while (true) {
        System.out.println(rmb.transComb());
    }
}

}</pre>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!