前言:

输入数字金额参数,运行程序得到其对应的大写中文金额;例如:输入— 12.56,输出— 12.56:壹拾贰元伍角陆分;重点来了:本人亲测有效

奉上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
/**
*@Title: ConvertUpMoney
* @Description: 将数字金额转为大写汉字金额
* @date: 2019年6月18日 下午10:52:27
*/
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) {
integerStr = "";
decimalStr = str.substring(1);
}else {
integerStr = str;
decimalStr = "";
}

//beyond超出计算能力,直接返回
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 = isWan5(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;
if (length == 1 && integers[0] == 0) {
return "";
}
for(int i=0;i<length;i++) {
String key = "";
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) {
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 isWan5(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;
}
}

//Test
public static void main(String[] args) {
String number = "12.56";
System.out.println(number+": "+ConvertUpMoney.toChinese(number));

number = "1234567890563886.123";
System.out.println(number+": "+ConvertUpMoney.toChinese(number));

number = "1600";
System.out.println(number+": "+ConvertUpMoney.toChinese(number));

number = "156,0";
System.out.println(number+": "+ConvertUpMoney.toChinese(number));

number = "-156,0";
System.out.println(number+": "+ConvertUpMoney.toChinese(number));

number = "0.12";
System.out.println(number+": "+ConvertUpMoney.toChinese(number));

number = "0.0";
System.out.println(number+": "+ConvertUpMoney.toChinese(number));

number = "01.12";
System.out.println(number+": "+ConvertUpMoney.toChinese(number));

number = "0125";
System.out.println(number+": "+ConvertUpMoney.toChinese(number));

number = "-0125";
System.out.println(number+": "+ConvertUpMoney.toChinese(number));

number = "sdw5655";
System.out.println(number+": "+ConvertUpMoney.toChinese(number));

System.out.println(null+": "+ConvertUpMoney.toChinese(null));
}

}

加个彩蛋:

本人在平时的学习中,还看到了一个十分有用的工具包,这个工具包中含有一个类型转换的方法,可以实现“ 金额的大小写 ”,但是这个工具包也有一些局限,“ 转换为大写只能精确到分(小数点儿后两位),之后的数字会被忽略 ”;这个工具包叫“ Hutool ”,学习地址:https://www.hutool.cn/docs/#/core/类型转换/类型转换工具类-Convert

不要忘记留下你学习的足迹 [点赞 + 收藏 + 评论]嘿嘿ヾ

一切看文章不点赞都是“耍流氓”,嘿嘿ヾ(◍°∇°◍)ノ゙!开个玩笑,动一动你的小手,点赞就完事了,你每个人出一份力量(点赞 + 评论)就会让更多的学习者加入进来!非常感谢! ̄ω ̄=