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

一、前言

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

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

小数部分:角、分、厘

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

二、注意

阿拉伯数字小写金额数字中有 “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 = getChineseInteger(integers, isWan) + getChineseDecimal(decimals);//返回最终的大写金额

        if (flag) {
            return "负" + result;//如果是负数,加上"负"
        } else {
            return result;
        }
    }

    //将字符串转为int数组
    private static int[] toIntArray(String number) {
        //初始化一维数组长度
        int[] array = new int[number.length()];
        //循环遍历赋值
        for (int i = 0; i < number.length(); i++) {
            array[i] = Integer.parseInt(number.substring(i, i + 1));
        }
        return array;
    }

    //将整数部分转为大写的金额
    public static String getChineseInteger(int[] integers, boolean isWan) {
        StringBuffer chineseInteger = new StringBuffer("");
        int length = integers.length;
        // 对于输入的字符串为 "0." 存入数组后为 0
        if (length == 1 && integers[0] == 0) {
            return "";
        }
        for (int i = 0; i < length; i++) {
            String key = "";//0325464646464
            if (integers[i] == 0) {
                if ((length - i) == 13)//万(亿)
                    key = IUNIT[4];
                else if ((length - i) == 9) {//亿
                    key = IUNIT[8];
                } else if ((length - i) == 5 && isWan) {//万
                    key = IUNIT[4];
                } else if ((length - i) == 1) {//元
                    key = IUNIT[0];
                }
                if ((length - i) > 1 && integers[i + 1] != 0) {
                    key += NUMBERS[0];
                }
            }
            chineseInteger.append(integers[i] == 0 ? key : (NUMBERS[integers[i]] + IUNIT[length - i - 1]));
        }
        return chineseInteger.toString();
    }

    //将小数部分转为大写的金额
    private static String getChineseDecimal(int[] decimals) { //角 分 厘   038  壹分捌厘
        StringBuffer chineseDecimal = new StringBuffer("");
        for (int i = 0; i < decimals.length; i++) {
            if (i == 3) {
                break;
            }
            chineseDecimal.append(decimals[i] == 0 ? "" : (NUMBERS[decimals[i]] + DUNIT[i]));
        }
        return chineseDecimal.toString();
    }

    //判断当前整数部分是否已经是达到【万】
    private static boolean isWanUnits(String integerStr) {
        int length = integerStr.length();
        if (length > 4) {
            String subInteger = "";
            if (length > 8) {
                subInteger = integerStr.substring(length - 8, length - 4);
            } else {
                subInteger = integerStr.substring(0, length - 4);
            }
            return Integer.parseInt(subInteger) > 0;
        } else {
            return false;
        }
    }

五、代码测试

  • 阿拉伯数字中包含 "0"的测试
  • 特殊情况的测试(特殊字符、负数、超过人民币数值范围)。
@Test
    public void test() {
        String number = "1409.50";
        String afterStr = ConvertUpMoney.toChinese(number);
        System.out.println(number + ": " + afterStr);//壹仟肆佰零玖元伍角
    }
    @Test
    public void test2() {
        String number = "6007.14";
        String afterStr = ConvertUpMoney.toChinese(number);
        System.out.println(number + ": " + afterStr);//陆仟零柒元壹角肆分
    }
    @Test
    public void test3() {
        String number = "1680.32";
        String afterStr = ConvertUpMoney.toChinese(number);
        System.out.println(number + ": " + afterStr);//壹仟陆佰捌拾元叁角贰分
    }
    @Test
    public void test4() {
        String number = "107000.53";
        String afterStr = ConvertUpMoney.toChinese(number);
        System.out.println(number + ": " + afterStr);//壹拾万零柒仟元伍角叁分
    }
    @Test
    public void test5() {
        String number = "16409.02";
        String afterStr = ConvertUpMoney.toChinese(number);
        System.out.println(number + ": " + afterStr);//壹万陆仟肆佰零玖元零贰分
    }
    @Test
    public void test6() {
        String number = "325.04";
        String afterStr = ConvertUpMoney.toChinese(number);
        System.out.println(number + ": " + afterStr);//叁佰贰拾伍元零肆分
    }

    @Test
    public void test7() {
        String number = "-0325.04";
        String afterStr = ConvertUpMoney.toChinese(number);//抱歉,请输入数字!
        System.out.println(number + ": " + afterStr);
    }

    @Test
    public void test8() {
        String number = "325#sdr";
        String afterStr = ConvertUpMoney.toChinese(number);//抱歉,请输入数字!
        System.out.println(number + ": " + afterStr);//325#sdr: 325#sdr
    }

    @Test
    public void test9() {
        String number = "-34327987";
        String afterStr = ConvertUpMoney.toChinese(number);//-34327987: 负叁仟肆佰叁拾贰万柒仟玖佰捌拾柒元
        System.out.println(number + ": " + afterStr);
    }

    @Test
    public void test10() {
        String number = "78934029675923532";
        System.out.println("长度 :" + number.length());//长度 :17
        String afterStr = ConvertUpMoney.toChinese(number);//78934029675923532:超出计算能力
        System.out.println(number + ": " + afterStr);
    }

图解转换的过程:

整数部分转化人民币大写方法简写

小数部分转换人民币大写方法简写

转换过程:

转换结果:

贰拾叁亿贰仟柒佰捌拾玖万叁仟肆佰壹拾玖元

到此这篇关于教你怎么用Java完成人民币大写转化的文章就介绍到这了,更多相关Java人民币大写转化内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java实现浮点数转人民币的小例子

    复制代码 代码如下: import java.util.ArrayList; import java.util.List; public class RMBConverter2 implements IRMBConverter { private static final String [] RMB_NUMBER ={"零","壹","贰","叁","肆","伍","陆&quo

  • java实现将数字转换成人民币大写

    Rmb.java public class Rmb { /** *人民币的基本信息和操作 *@author weinee *@version 1.0 */ double number; //人民币的数量 private String[] hanArr = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "

  • java实现人民币大小写转换方法分享

    复制代码 代码如下: /**     * 人民币转成大写     *      * @param value     * @return String     */    public static String hangeToBig(double value)    {        char[] hunit = { '拾', '佰', '仟' }; // 段内位置表示        char[] vunit = { '万', '亿' }; // 段名表示        char[] digi

  • java实现数字转换人民币中文大写工具

    本文实例为大家分享了java实现数字转换人民币中文大写的具体代码,供大家参考,具体内容如下 业务场景: 1.在人事业务系统开发的报表打印文书时经常需要将人民币数值转换为大写, 所以用java写了一个通用的大写转换函数. 为了更加方便调用函数的参数使用字符串类型.例如:825.45 转换后:捌佰贰拾伍元肆角伍分 2.在人事业务系统中经常把日期用汉字大写表示,为了方便调用函数,也是使用字符串类型.例如:2018 转换后:二〇一八 下面为java代码 public class Data2Zh { fi

  • Java人民币小写转大写字符串的实现

    写了一个人民币小写转大写的方法,Java版本,思路很简单,没有测出什么Bug,有bug欢迎反馈 public class RMBChange { private static String[] nums = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};

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

    一.前言 人民币大写金额的正确写法: 整数部分:零.壹.贰.叁.肆.伍.陆.柒.捌.玖 小数部分:角.分.厘 数位部分:拾.佰.仟.万.亿.元 二.注意 阿拉伯数字小写金额数字中有 "0" 时,中文大写应按照汉语语言规律.金额数字构成和防止涂改的要求进行书写.举例如下: 1.阿拉伯数字中间有 "0" 时,中文大写要写"零"字,如¥1409.50应写成人民币壹仟肆佰零玖元伍角. 2.阿拉伯数字中间连续有几个 "0" 时.中文大写

  • java字符串的大写字母右移实现方法

    实例如下: import java.util.Scanner; /** * Created by Admin on 2017/3/27. */ public class test02 { public static String RightUpper(String str){ char[] S=str.toCharArray(); int count=0; for(int i=0;i<str.length();i++) { if(Character.isLowerCase(S[i])){ cha

  • php阿拉伯数字转中文人民币大写

    本文实例为大家分享了php阿拉伯数字转中文人民币大写的实现代码,供大家参考,具体代码如下 代码1:php阿拉伯数字转中文人民币大写,有详细的注释 /** *数字金额转换成中文大写金额的函数 *String Int $num 要转换的小写数字或小写字符串 *return 大写字母 *小数位为两位 **/ function num_to_rmb($num){ $c1 = "零壹贰叁肆伍陆柒捌玖"; $c2 = "分角元拾佰仟万拾佰仟亿"; //精确到分后面就不要了,所以

  • C#实现人民币大写转换示例代码

    复制代码 代码如下: /// <summary>/// 人民币大写/// </summary>/// <param name="input">待转换输入</param>/// <param name="prefix">需要添加人民币前缀</param>/// <exception cref="ArgumentException" />/// <returns

  • 数字金额大写转换器制作代码分享(人民币大写转换)

    复制代码 代码如下: /// <summary>/// 人民币大写/// </summary>/// <param name="input">待转换输入</param>/// <param name="prefix">需要添加人民币前缀</param>/// <exception cref="ArgumentException" />/// <returns

  • python实现人民币大写转换

    本文实例为大家分享了python实现人民币大写转换的具体代码,供大家参考,具体内容如下 #!/usr/bin/python # -*- coding:utf-8 -*- # ********* 转换方法介绍 ********* # 将需要转换的数字从右向左,每4位分成一个section,如:24530467103,将该数字拆分后,得到: # 245 3046 7103 (245亿3046万7103) # 对拆分后的数字先按照section进行数字到汉字的转换,然后添加数值单位,如:仟,佰,拾,处

  • 教你怎么用Java获取国家法定节假日

    前言 此节假日为严格按照国家要求的双休和法定节假日并且包含节假日的补班信息,大家可根据自己的需求自定义处理哦. 以下为Maven配置,是程序用到的依赖.版本的话,可以用最新的. Maven配置 <!-- okhttp --> <dependency> <groupId>com.squareup.okhttp</groupId> <artifactId>okhttp</artifactId> <version>${okhtt

  • 教你如何使用Java多线程编程LockSupport工具类

    LockSupport类 用于创建锁和其他同步类的基本线程阻塞原语,此类与使用它的每个线程关联一个许可.如果获得许可,将立即返回对park的调用,并在此过程中消耗掉它:否则may会被阻止.调用unpark可使许可证可用(如果尚不可用).(不过与信号量不同,许可证不会累积.最多只能有一个.) 方法park和unpark提供了有效的阻塞和解阻塞线程的方法,这些线程不会遇到导致已弃用的方法Thread.suspend和Thread.resume无法用于以下问题:由于许可,在调用park的一个线程与试图

  • 教你如何用Java替换Word中带有${}的内容

    一.概述 1.因为有些需求,需要把word文档里面的特定数据,设置成可变的:所以需要某种方式,把可变量用标签(如${变量名})替换,通过后端赋值此变量名,重新生成的Word就能根据后端设置的内容变化. 2.替换方法:准备一份word模板文档,如:word_mode.doc(或 word_mode.docx) 文件,把可变内容,用标签${变量名}替换(如图1姓名:${name}) 3.转成可读模板:全部设置完变量标签后,对此word文档进行另存为xml格式的文档(图2),保存后的文件名:word_

  • 教你怎么实现java语言的在线编译

    一.前言 使用过leetcode或者类似在线编译网站功能的人,或许会比较感兴趣,关于在线编译的实现原理,由于我比较头铁,所以一冲动之下毕业设计的项目选择制作一个类似于在线编译的一个网站. 在决定做这个之前,大概对这方面的东西一窍不通,网上的资料很多也是比较千篇一律,给我这种萌新带来的难度不是一点半点,当然,最终收获还是挺大的,所以想写一点东西,作为梳理,也给以后想学的人做一个参考作用(其实在写的过程中还是踩了一些坑的). 最终,其实成果挺水的,做出来的成品,就只是实现了一个简陋的Java语言的在

随机推荐