教你怎么用Java完成人民币大写转化

论坛 期权论坛 脚本     
niminba   2021-5-23 02:55   720   0

一、前言

人民币大写金额的正确写法:

整数部分:零、壹、贰、叁、肆、伍、陆、柒、捌、玖

小数部分:角、分、厘

数位部分:拾、佰、仟、万、亿、元

二、注意

阿拉伯数字小写金额数字中有 “0” 时,中文大写应按照汉语语言规律、金额数字构成和防止涂改的要求进行书写。举例如下:

1、阿拉伯数字中间有 “0” 时,中文大写要写“零”字,如¥1409.50应写成人民币壹仟肆佰零玖元伍角。

2、阿拉伯数字中间连续有几个 “0” 时、中文大写金额中间可以只写一个“零”字,如¥6007.14应写成人民币陆仟零柒元壹角肆分。

3、阿拉伯金额数字万位和元位是 “0” ,或者数字中间连续有几个 “0” ,万位、元位也是 “0” 但千位、角位不是 “0” 时,中文大写金额中可以只写一个零字,也可以不写“零”字,
如¥1680.32应写成人民币壹仟陆佰捌拾元零叁角贰分,或者写成人民币壹仟陆佰捌拾元叁角贰分。又如¥107000.53应写成人民币壹拾万柒仟元零伍角叁分,或者写成人民币壹拾万零柒仟元伍角叁分。

4、阿拉伯金额数字角位是 “0” 而分位不是 “0” 时,中文大写金额“元”后面应写“零”字,如¥16409.02应写成人民币壹万陆仟肆佰零玖元零贰分,又如¥325.04应写成人民币叁佰贰拾伍元零肆分。

三、思路分析

  • 初始化人民币大写金额,其中数位的顺序是有要求的。
  • 对传入的字符串进行校验(非空、特殊字符)
  • 判断字符串的长度是否超过了转换范围
  • 判断是否存在负数,对负号进行替换
  • 分离整数部分和小数部分
  • 判断整数部分是否已经达到万

这里使用到了一个StringUtils类和单元测,junit,需要导入依赖

<dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

四、完整代码

public class ConvertUpMoney {
    //整数部分的人民币大写
    private static final String[] NUMBERS = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
    //数位部分
    private static final String[] IUNIT = {"元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟"};
    //小数部分的人民币大写
    private static final String[] DUNIT = {"角", "分", "厘"};

    //转成中文的大写金额
    public static String toChinese(String str) {
        //判断输入的金额字符串是否符合要求
        if (StringUtils.isBlank(str) || !str.matches("(-)?[\\d]*(.)?[\\d]*")) {
            System.out.println("抱歉,请输入数字!");
            return str;
        }
        //判断输入的金额字符串
        if ("0".equals(str) || "0.00".equals(str) || "0.0".equals(str)) {
            return "零元";
        }

        //判断是否存在负号"-"
        boolean flag = false;
        if (str.startsWith("-")) {
            flag = true;
            str = str.replaceAll("-", "");
        }
        //如果输入字符串中包含逗号,替换为 "." 
        str = str.replaceAll(",", ".");

        String integerStr;//整数部分数字
        String decimalStr;//小数部分数字


        //分离整数部分和小数部分
        if (str.indexOf(".") > 0) {//整数部分和小数部分
            integerStr = str.substring(0, str.indexOf("."));
            decimalStr = str.substring(str.indexOf(".") + 1);
        } else if (str.indexOf(".") == 0) {//只存在小数部分 .34
            integerStr = "";
            decimalStr = str.substring(1);
        } else { //只存在整数部分 34
            integerStr = str;
            decimalStr = "";
        }

        //整数部分超出计算能力,直接返回
        if (integerStr.length() > IUNIT.length) {
            System.out.println(str + ":超出计算能力");
            return str;
        }

        //整数部分存入数组  目的是为了可以动态的在字符串数组中取对应的值
        int[] integers = toIntArray(integerStr);

        //判断整数部分是否存在输入012的情况
        if (integers.length > 1 && integers[0] == 0) {
            System.out.println("抱歉,请输入数字!");
            if (flag) {
                str = "-" + str;
            }
            return str;
        }
        boolean isWan = isWanUnits(integerStr);//设置万单位

        //小数部分数字存入数组
        int[] decimals = toIntArray(decimalStr);

        String result = getChineSF#sr#У7GFWBvgB#G&i[Ni[:XnXKk	[ZJ~Xiikk9^zi7G&У7GFWBv6V"#YhY~h"7&3GG3F&'22V"c&F#3C3s3CVF#f#f#c3S66c3rr#У7GFWBvgB#G&[XnhKk	[ZJ~Xiikk9^zi7G&У7GFWBv6V"#YhY~h"7&3GG3F&'22V"c33sF36C33S33sScs66fVr#УG&h7G&У7GFWBv6V"#YhY~h"7&3GG3F&'22V"ccc6CF&cS#C3S&SvSs"r#УG&h{>i7G&У6VУG&KhKhhnK~X(nKZ;hnXX37G&У&6VУjX[>KKhyJfZKk	[ZJ~XiXyNih~z[K{NZIyX[4fKk	[ZJ~XiXXh^Z{J.zKK^XNih~zhn{~{XyNyX[>ih~z[ZJ~Z^YZIiJ
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP