首页 > 其他分享 >小写数字金额转大写

小写数字金额转大写

时间:2024-06-21 17:20:32浏览次数:16  
标签:return String money s1 大写 小写 sb append 数字

package pbs.provider.feeshow.utils;

import java.math.BigDecimal;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 2022/5/5
 *
 * @author lf
 */
public class MoneyToChineseUtils {
    /**
     * 不考虑分隔符的正确性
     */
    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(String money) {
        //money = Math.abs(money);
        if ("0".equals(money) || "0.0".equals(money) || "0.00".equals(money)) {
            return "零元整";
        }
        String amount = moneyFormat(money);
        // 去掉分隔符
        amount = amount.replace(",", "");
        // 验证金额正确性

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

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

        String result = "";
        if (!integer.equals("0")) {
            // 整数部分
            result += integer2rmb(integer) + UNITS[0];
        }
        if (fraction.equals("00")) {
            // 添加[整]
            result += UNITS[3];
        } else if (fraction.startsWith("0") && integer.equals("0")) {
            // 去掉分前面的[零]
            result += fraction2rmb(fraction).substring(1);
        } else {
            // 小数部分
            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) {
        StringBuilder buffer = new StringBuilder();
        // 从个位数开始转换
        int i, j;
        for (i = integer.length() - 1, j = 0; i >= 0; i--, j++) {
            char n = integer.charAt(i);
            if (n == '0') {
                // 当n是0且n的右边一位不是0时,插入[零]
                if (i < integer.length() - 1 && integer.charAt(i + 1) != '0') {
                    buffer.append(RMB_NUMS[0]);
                }
                // 插入[万]或者[亿]
                if (j % 4 == 0) {
                    if (i > 0 && integer.charAt(i - 1) != '0'
                            || i > 1 && integer.charAt(i - 2) != '0'
                            || i > 2 && integer.charAt(i - 3) != '0') {
                        buffer.append(U2[j / 4]);
                    }
                }
            } else {
                if (j % 4 == 0) {
                    // 插入[万]或者[亿]
                    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();
    }

    /**
     * 对金额的格式调整到分
     *
     * @param preMoney
     * @return
     */
    public static String moneyFormat(BigDecimal 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();
    }

    /**
     * 对金额的格式调整到分
     *
     * @param preMoney
     * @return
     */
    public static String moneyFormat(String preMoney) {
        //23->23.00
        String money = preMoney;
        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();
    }


    /**
     * @param args
     */
    public static void main(String[] args) {
//        System.out.println(MoneyToChineseUtils.moneyFormat(123.2803));
        BigDecimal bigDecimal = new BigDecimal("101010101.11");
        System.out.println(MoneyToChineseUtils.convert(bigDecimal.toString()));
    }

}

转载:https://blog.csdn.net/private_name/article/details/124592020

标签:return,String,money,s1,大写,小写,sb,append,数字
From: https://www.cnblogs.com/wlv1314/p/18260964

相关文章

  • 数字样机:飞行器状态控制系统仿真
    ​引言:数字样机起源于20世纪90年代,是一种用数字化模型代替实际物理样机进行仿真分析的技术。传统的飞行器研发流程往往遵循一套特定的循环结构:在设计初期,工程人员需要对飞行器提供一个综合的设计思路(初期蓝图),随后对原型机进行可行性分析,将结论进行反馈,最后对初期蓝图进行下一步修......
  • 影刀RPA助力企业数字化转型,简单易用成最大亮点
    1.介绍影刀RPA技术1.1影刀RPA的定义和原理1.1影刀RPA的定义和原理影刀RPA(RoboticProcessAutomation)是一种基于软件机器人或人工智能技术的自动化工具,用于执行重复性、规则性的业务流程或任务。其原理是通过模拟人类操作,自动执行电脑上的任务,包括数据输入、数据处理......
  • 编写一个C程序,使得读取输入的字符串,统计并输出字符串中大写字母、小写字母、数字和其
    #include<stdio.h>#include<string.h>intmain(){   charstr[100];    //赋予字符长度为100的存储空间   inti,uppercase=0,lowpercase=0,number=0,other=0;    //变量初始化   printf("请输入字符串:");   gets(str);    ......
  • IT运维全面数字化|芯片设计行业领跑打造运维流程闭环
    在当今数字化转型的浪潮中,科技行业正经历着前所未有的变革。随着5G、人工智能、物联网等新兴技术的快速发展,企业对于高效、智能的运营模式的需求日益迫切。芯片设计公司作为科技产业链中的关键一环,不仅要在技术创新上保持领先,更要在运营管理上实现突破。这些公司迫切需要通过引入......
  • 低空经济与数字孪生的关系
    既然现在各地都在大力发展低空经济,争取做低空经济第一城,那自然给数字孪生行业带来了新的商机。数字孪生厂商也不负众望,居然真的有公司在推相关的产品,行业内卷之烈可见一斑!个人认为数字孪生技术在低空经济中还是可以扮演一定的角色,起到重要的作用,具体来说有如下方面:模拟与规......
  • C-对输入的数字进行统计
    编写函数,实现统计和输出一个正整数中各位数字中零的个数,及各位数字中最大者。   例如:1080其零的个数是2,各位数字中最大者是8。主函数负责正整数的输入。#include<stdio.h>//统计整数中零的个数intcountZeros(intnum){intcount=0;while(nu......
  • 用python写——猜数字小游戏2
    importrandomnum=random.randint(1,100)count=0flag=Truewhileflag:guess_num=int(input("请输入你要猜测的数字:"))count+=1ifguess_num==num:print("恭喜你,猜对了")flag=Falseelse:ifguess_n......
  • “数字东哥”出圈,618风向转变
    618已经走过了十几年。随着技术、用户需求以及商业形态的变化,618也进化到了一个新阶段。今年618,在一片低价促销声中,京东的数字人直播格外抢眼。4月中旬,由刘强东数字人直播点燃了第一把火,在收官阶段,再由18位企业创始人的数字分身在京东接力直播。这也让我们看到电商平台发展的新风......
  • 数字乡村:绘就乡村振兴的智慧新画卷
    在乡村振兴战略的宏伟蓝图下,“数字乡村”作为新时代农村现代化的重要抓手,正悄然改变着中国乡村的面貌。本文旨在深度剖析数字乡村建设的核心价值、关键技术、成功案例以及未来展望,为乡村振兴战略提供前瞻性的思考与启示。 数字乡村的核心价值数字乡村建设以信息技术为......
  • 远光全栈AIGC数字创新平台入选“大模型行业应用十大典范案例”
    6月4日至7日,由数字产业创新研究中心主办的2024中国数字企业峰会举行,远光软件自主研发的《全栈AIGC数字创新平台YG-JTGPT》凭借其卓越的AIGC技术创新实力与创新推广应用,成功入选“大模型行业应用十大典范案例”榜单。 本届峰会以“AI+数据x向未来”为主题,聚焦AI+融合创新......