这篇文章给大家分享的是有关如何使用Java完成人民币大写转化的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Queue队列:有序,可重复的;3、Set集合:不可重复;4、Map映射:无序,键唯一,值不唯一。
人民币大写金额的正确写法:
整数部分:零、壹、贰、叁、肆、伍、陆、柒、捌、玖
小数部分:角、分、厘
数位部分:拾、佰、仟、万、亿、元
阿拉伯数字小写金额数字中有 “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完成人民币大写转化”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。