实现人民币大写代码解析

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());
        }
    }
}

本程序可以实现 0 到 9999 9999 9999.994 以内的人民币大写转换,精确到分

 

测试数据:

0

希望转换出来的结果为:

零元零角零分

1234

希望转换出来的结果为:

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

9999

希望转换出来的结果为:

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

1234.5

希望转换出来的结果为:

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

1234.9

希望转换出来的结果为:

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

1234.56

希望转换出来的结果为:

壹仟贰佰叁拾肆元伍角陆分

1234.99

希望转换出来的结果为:

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

1234.994

希望转换出来的结果为:

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

1234.999

希望转换出来的结果为:

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

999999999999.999

希望转换出来的结果为:

数据过大,无法进行转换,请重新输入!

转载于:https://www.cnblogs.com/ifindu-san/p/9848090.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数字转成人民币大写代码 Public Function GetChinaNum(otherNum As Double, Optional isRMB As Boolean, Optional numOption As Boolean, Optional dotNum As Integer) As String On Error Resume Next num = Trim(Str(Int(otherNum))) If isRMB Then numwei = "拾佰仟万拾佰仟亿拾佰仟" numshu = "零壹贰叁肆伍陆柒捌玖拾" Else numwei = "十百千万十百千亿十百千" numshu = "零一二三四五六七八九十" End If If otherNum < 20 And otherNum >= 10 Then num = Right(num, 1) GetChinaNum = Left(numwei, 1) End If For i = 1 To Len(num) bstr = Mid(num, i, 1) If numOption Then GetChinaNum = GetChinaNum + Mid(numshu, Val(bstr) + 1, 1) Else GetChinaNum = GetChinaNum + Mid(numshu, Val(bstr) + 1, 1) If bstr = "0" Then If Mid(numwei, Len(num) - i, 1) = "万" Or Mid(numwei, Len(num) - i, 1) = "亿" Then Do While Right(GetChinaNum, 1) = "零" GetChinaNum = Left(GetChinaNum, Len(GetChinaNum) - 1) Loop GetChinaNum = GetChinaNum + Mid(numwei, Len(num) - i, 1) End If Else GetChinaNum = GetChinaNum + Mid(numwei, Len(num) - i, 1) End If GetChinaNum = Replace(GetChinaNum, "零零", "零") End If Next i If numOption = False Then Do While Right(GetChinaNum, 1) = "零" GetChinaNum = Left(GetChinaNum, Len(GetChinaNum) - 1) Loop End If If isRMB Then numrmb = "元角分" GetChinaNum = GetChinaNum + Mid(numrmb, 1, 1) If Val(num) <> otherNum Then num = Trim(Str(Round(otherNum - Val(num), 2))) For i = 2 To Len(num) bstr = Mid(num, i, 1) GetChinaNum = GetChinaNum + Mid(numshu, Val(bstr) + 1, 1) + Mid(numrmb, i, 1) Next i Else GetChinaNum = GetChinaNum + "整" End If Else If Val(num) <> otherNum Then If dotNum = 0 Then dotNum = 4 num = Trim(CStr(Round(otherNum - Val(num), dotNum))) If GetChinaNum = "" Then GetChinaNum = "零" GetChinaNum = GetChinaNum + "点" For i = 2 To Len(num) bstr = Mid(num, i, 1) GetChinaNum = GetChinaNum + Mid(numshu, Val(bstr) + 1, 1) Next i End If End If End Function

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值