java 数字大小写转换工具类--适用于打印收据

本工具类主要实现数字double1000.00====>>零万壹仟零佰零拾零元零角零分,注释很详细,就不多做介绍了

        /**
         * 不考虑分隔符的正确性
         */
        private static final Pattern AMOUNT_PATTERN = Pattern.compile("^(0|[1-9]\\d{0,11})\\.(\\d\\d)$");
        private static final char[] RMB_NUMS = "零壹贰叁肆伍陆柒捌玖".toCharArray();
        private static final String[] UNITS = {"元", "角", "分"};
        private static final String[] U1 = {"", "拾", "佰", "仟"};
        private static final String[] U2 = {"", "万", "亿"};

        /**
         * 将金额(整数部分等于或少于12位,小数部分2位)转换为中文大写形式.
         *
         * @param money 金额数字
         * @return 中文大写
         */
        public static String convert(Double money) {
            money = Math.abs(money);
            if (Double.valueOf(0).equals(money)) {
                return "零元";
            }
            String amount = moneyFormat(money);
            // 去掉分隔符
            amount = amount.replace(",", "");
            // 验证金额正确性

            Matcher matcher = AMOUNT_PATTERN.matcher(amount);
            if (!matcher.find()) {

            }
            // 整数部分
            String integer = matcher.group(1);
            int i=Integer.valueOf(integer);
            // 小数部分
            String fraction = matcher.group(2);

            String result = "";
            result += integer2rmb(integer) + UNITS[0];
                // 小数部分
            result += fraction2rmb(fraction);
            return result;
        }

        /**
         * 将金额小数部分转换为中文大写
         */
        private static String fraction2rmb(String fraction) {
            // 角
            char jiao = fraction.charAt(0);
            // 分
            char fen = fraction.charAt(1);
            return (RMB_NUMS[jiao - '0'] + (jiao >= '0' ? UNITS[1] : "")) + (fen >= '0' ? RMB_NUMS[fen - '0'] + UNITS[2] : "");
        }

        /**
         * 将金额整数部分转换为中文大写
         *
         * @param integer
         * @return
         */
        private static String integer2rmb(String integer) {
            String integer1=integer;
            StringBuilder buffer = new StringBuilder();
            // 从个位数开始转换,因我所用收据单最多到万字段,所以最长长度为5
            if (integer.length()<2&&integer.length()>0){
                integer1="0"+"0"+"0"+"0"+integer;
            }else if (integer.length()<3&&integer.length()>1){
                integer1="0"+"0"+"0"+integer;
            }else if (integer.length()<4&&integer.length()>2){
                integer1="0"+"0"+integer;
            }else if (integer.length()<5&&integer.length()>3){
                integer1="0"+integer;
            }
            int i, j;
            for (i =integer1.length()-1, j = 0; i >= 0; i--, j++) {
                char n = integer1.charAt(i);
                if (n==48){//此处是万位为0,执行下列操作
                    // 插入[万]或者[亿]
                    buffer.append(U2[j / 4]);
                    // 插入[拾]、[佰]或[仟]
                    buffer.append(U1[j % 4]);
                }else {
                    // 插入[万]或者[亿]
                    buffer.append(U2[j / 4]);
                    // 插入[拾]、[佰]或[仟]
                    buffer.append(U1[j % 4]);
                }
                buffer.append(RMB_NUMS[n - '0']);
            }
            return buffer.reverse().toString();
        }

        /**
         * 对金额的格式调整到分
         *
         * @param preMoney
         * @return
         */
        public static String moneyFormat(Double preMoney) {
            //23->23.00
            String money = preMoney.toString();
            StringBuffer sb = new StringBuffer();
            if (money == null) {
                return "0.00";
            }
            int index = money.indexOf(".");
            if (index == -1) {
                return money + ".00";
            } else {
                //整数部分
                String s0 = money.substring(0, index);
                //小数部分
                String s1 = money.substring(index + 1);
                if (s1.length() == 1) {
                    //小数点后一位
                    s1 = s1 + "0";
                } else if (s1.length() > 2) {
                    //如果超过3位小数,截取2位就可以了
                    s1 = s1.substring(0, 2);
                }
                sb.append(s0);
                sb.append(".");
                sb.append(s1);
            }
            return sb.toString();
        }

下图是测试情况

结果:

该工具类借鉴了csdn用户君子志邦的【JAVA工具类】金额与汉字大小写的转换 金额转换,在其原有功能之上做出了部分调整,若有问题,请联系本人删除,谢谢理解

以下是原文出处:

https://blog.csdn.net/u011488009/article/details/89966655

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值