java人民币数字转大写汉字(小写转为大写).java

这篇具有很好参考价值的文章主要介绍了java人民币数字转大写汉字(小写转为大写).java。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

对上篇文章优化,更简单易懂

java--人民币小写(金额)转为大写(金额转换)_CY_99的博客-CSDN博客_实数小写金额转大写pta

1,实现思路

        因为汉语读法的特殊性把数字通过四位进行分割,因为千、百、十是重复使用的(壹百,壹百万,壹佰亿)。千、百、十我们看做四位中的小单位。亿和万看做四位结束后的大单位。分为两个单位数组。如下:

            //四位间隔的大单位
            String BigUnit[] = {"亿", "万", "元"};
            //四位之间的小单位
            String smallUnit[] = {"千", "百", "十", ""};
            //通过map来进行大小写转换。
            String[] upNum = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};

        通过两层循环,外层控制大单位在数组中索引和按照四位分割的字符串截取。内层循环进行对四位之间的处理(包括汉字转换和单位拼接),如下:

for (int i = 0; i < length; i++) {
    //1.取大单位

    //2.字符串分割
               
    //3.处理四位之间数据 substrNum:分割后的字符串
    for (int j = 0; j < substrNum.length(); j++) {
        //汉字转换和单位拼接 TODO
    }
    //重置开始索引。
    indexS = indexE;
}

2.实现

有了思路,下面对具体的汉字转换和单位拼接进行实现。因为要控制0在不同位置的记录所以,要考虑全面。最后实现如下:

public static String dealMoney(String inputStr) {
        StringBuilder resultStrBuld = new StringBuilder();
        String[] split = inputStr.split("\\.");
        String intStr = split[0];
        //@@@@@@@@@@处理整数部分
        try {
            //四位间隔的大单位
            String BigUnit[] = {"亿", "万", "元"};
            //四位之间的小单位
            String smallUnit[] = {"千", "百", "十", ""};
            String[] upNum = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
            if (intStr.matches("^[0]+$")) {
                //如果全是输入的 0 返回
                if(split.length==2 && split[1].matches("^[0]+$")){
                    return "零元零角零分";
                }
            }
            //去掉以整数部分为0开头的情况 eg:0000456 return 456
            intStr = cutFrontZeros(intStr);
            //按照四位进行处理进行转换,length是处理的次数
            int length = intStr.length() / 4;
            if ((intStr.length() % 4) > 0) {
                //有余数次数+1
                length++;
            }
            //获取截取的前索引
            int indexS = 0;
            int indexE = 0;
            //处理四位间隔数据
            for (int i = 0; i < length; i++) {
                //取大单位的索引
                int Bindex = 0;
                if (length < 3) {
                    Bindex = i + (3 - length);
                } else {
                    Bindex = i;
                }
                //分割索引
                if (i == 0 && ((intStr.length() % 4) > 0)) {
                    indexE = intStr.length() % 4;
                } else {
                    indexE = indexE + 4;
                }
                String substrNum = intStr.substring(indexS, indexE);
                //处理四位之间数据
                for (int j = 0; j < substrNum.length(); j++) {
                    //判断截取字符串之后是否全是0
                    boolean subStrAllzero = false;
                    //substrNum后面全是0
                    if (substrNum.substring(j, substrNum.length()).matches("^[0]+$")) {
                        subStrAllzero = true;
                    }
                    //判断这一位是否是0
                    boolean thisCharIs = false;
                    if ("0".equals(String.valueOf(substrNum.charAt(j)))) {
                        thisCharIs = true;
                    } else {
                        thisCharIs = false;
                    }
                    //取小单位索引
                    int Sindex = 0;
                    if (substrNum.length() != 4) {
                        Sindex = Sindex + (4 - substrNum.length() + j);
                    } else {
                        Sindex = j;
                    }
                    /*拼接数字对应汉字
                        如果后面全是0拼接单位,并结束循环(需要剔除0000这种情况)
                        否则拼接大写汉字,如果上一位且这一位是零不拼接汉字
                        */
                    if (subStrAllzero) {
                        if (j != 0 || i == (length - 1)) {
                            resultStrBuld.append(BigUnit[Bindex]);
                        }
                        break;
                    } else { //if((!lastCharIs || !thisCharIs))
                        if (resultStrBuld.toString().endsWith("零") && thisCharIs) {

                        } else {
                            resultStrBuld.append(upNum[Integer.parseInt(String.valueOf(substrNum.charAt(j)))]);
                        }
                    }
                    /*
                     * 拼接单位
                     *   如果是最后一位,拼接大单位
                     *   否则拼接小单位
                     *       如果上一位是零则不拼接单位,等非零情况拼接单位
                     * */
                    if ((j == (substrNum.length() - 1))) {
                        resultStrBuld.append(BigUnit[Bindex]);
                    } else {
                        if (!resultStrBuld.toString().endsWith("零")) {
                            resultStrBuld.append(smallUnit[Sindex]);
                        }
                    }
                }
                //重置字符串截取的开始索引。
                indexS = indexE;
            }
            //@@@@@@@@@@处理整数部分 END

            //@@@@@@@@@@处理小数部分
            if (split.length == 2) {
                String point = split[1];
                if (point.length() == 1) {
                    resultStrBuld.append(upNum[Integer.parseInt(String.valueOf(point.charAt(0)))]).append("角").append("零分");
                } else {
resultStrBuld.append(upNum[Integer.parseInt(String.valueOf(point.charAt(0)))]).append("角").append(upNum[Integer.parseInt(String.valueOf(point.charAt(1)))]).append("分");
                }
            } else {
                resultStrBuld.append("整");
            }
        } catch (Exception e) {
            e.printStackTrace();
            return "null";
        }
        return resultStrBuld.toString();
    }
    /**
     * 去掉第一位为0的情况
     * 0000000001.02 = 1.02
     *
     * @param str
     * @return
     */
    public static String cutFrontZeros(String str) {
        //如果全为整数部分全为0,保留一个0
        if("".equals(str.replaceAll("0",""))){
            return "0";
        }
        String s = str;
        if (str.startsWith("0")) {
            s = cutFrontZeros(str.substring(1, str.length()));
        }
        return s;
    }

3.测试

我们进行验证一下。分别对101,10010,10100000,10000000001,100010000100,100.2,100001.02,01.62进行输出测试。对输入数据进行了限制,最大支持12位整数,两位小数。

        if (num.matches("^[0-9]{0,12}|[0-9]{0,12}+([.]{1}[0-9]{1,2})$")) {
            System.out.println(dealMoney(num));
        } else {
            System.out.println("请检查金额(整数位不能超过12位,小数不能超过2位)");
        }

测试结果:

java人民币数字转大写汉字(小写转为大写).java

101:壹百零壹元整
10010:壹万零壹十元整
10100000:壹千零壹十万元整
10000000001:壹百亿零壹元整
100010000100:壹千亿壹千万零壹百元整
100.2:壹百元贰角零分
100001.02:壹十万零壹元零角贰分
01.62:壹元陆角贰分

 :如果大家测试有问题,可以评论留言。别忘了收藏哦~


版权归属作者(CY_99),未经许可,严禁转载!

——2023-02-06文章来源地址https://www.toymoban.com/news/detail-403218.html

到了这里,关于java人民币数字转大写汉字(小写转为大写).java的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包