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

网友投稿 1124 2023-01-26

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

教你怎么用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,需要导入依赖

commons-lang

commons-lang

2.6

junit

junit

4.12

test

四、完整代码

public class ConvertUpMoney {

//整数部分的人民币大写

private static final String[] NUMBERS = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};

//数位部分

private static final String[] IUNIT = {"元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟"};

//小数部分的人民币大写

private static final String[] DUNIT = {"角", "分", "厘"};

//转成中文的大写金额

public static String toChinese(String shttp://tr) {

//判断输入的金额字符串是否符合要求

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);

}

图解转换的过程:

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

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

转换过程:

转换结果:

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:跨端开发应用场景包括(前端领域有哪些成熟的跨端开发方案)
下一篇:将原生JDBC封装实现CRUD的案例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~