java实现人民币金额转换成大写中文(附完整源码)
时间: 2023-11-09 17:05:34 浏览: 152
以下是Java实现人民币金额转换成大写中文的完整源码:
```java
import java.math.BigDecimal;
public class RMBAmountToChinese {
private static final String[] CN_NUM = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}; // 中文数字
private static final String[] CN_UNIT = {"", "拾", "佰", "仟", "万", "亿"}; // 中文单位
private static final BigDecimal HUNDRED = new BigDecimal("100"); // 100
private static final BigDecimal TEN_THOUSAND = new BigDecimal("10000"); // 10000
private static final BigDecimal ONE_HUNDRED_MILLION = new BigDecimal("100000000"); // 1亿
/**
* 将人民币金额转换成大写中文
* @param amount 人民币金额,最大支持1亿
* @return 大写中文金额
*/
public static String rmbAmountToChinese(BigDecimal amount) {
StringBuilder sb = new StringBuilder();
amount = amount.setScale(2, BigDecimal.ROUND_HALF_UP); // 保留2位小数并四舍五入
if (amount.compareTo(ONE_HUNDRED_MILLION) >= 0) { // 1亿及以上
BigDecimal quotient = amount.divide(ONE_HUNDRED_MILLION, BigDecimal.ROUND_DOWN); // 商
BigDecimal remainder = amount.remainder(ONE_HUNDRED_MILLION); // 余数
sb.append(convert(quotient)).append("亿");
if (remainder.compareTo(BigDecimal.ZERO) > 0) {
sb.append(convert(remainder));
}
} else { // 1亿以下
sb.append(convert(amount));
}
return sb.toString();
}
// 将数字转换成大写中文
private static String convert(BigDecimal num) {
StringBuilder sb = new StringBuilder();
String str = num.toString();
int index = str.indexOf("."); // 小数点位置
if (index == -1) { // 整数
index = str.length();
}
String integerPart = str.substring(0, index); // 整数部分
String decimalPart = str.substring(index + 1); // 小数部分
int length = integerPart.length();
boolean zero = false; // 是否有过连续的零
for (int i = 0; i < length; i++) {
int digit = integerPart.charAt(i) - '0'; // 当前数字
if (digit == 0) { // 当前数字是0
if (!zero && length - i < CN_UNIT.length) { // 如果前面没有连续的零,并且数字不是在万或亿的单位,则加上零
sb.append(CN_NUM[digit]);
zero = true;
}
} else { // 当前数字不是0
if (zero) { // 如果前面有连续的零,则加上零
sb.append(CN_NUM[0]);
zero = false;
}
sb.append(CN_NUM[digit]).append(CN_UNIT[length - i - 1]);
}
}
if (decimalPart.equals("00")) { // 没有小数部分
sb.append("整");
} else { // 有小数部分
sb.append(CN_NUM[decimalPart.charAt(0) - '0']).append("角");
if (decimalPart.length() > 1 && decimalPart.charAt(1) != '0') {
sb.append(CN_NUM[decimalPart.charAt(1) - '0']).append("分");
}
}
return sb.toString();
}
public static void main(String[] args) {
BigDecimal amount = new BigDecimal("1234567.89"); // 人民币金额
String chineseAmount = rmbAmountToChinese(amount); // 转换成中文金额
System.out.println(chineseAmount); // 输出结果:壹佰贰十三万肆仟伍佰陆拾柒元捌角玖分
}
}
```
通过以上代码,我们可以将一个人民币金额转换为大写的中文金额。其中,我们使用了BigDecimal类进行精度计算,同时使用了StringBuilder类进行字符串拼接。
阅读全文