金额转换Java工具类
好久没时间更新了,在实习,实在有些忙。在实习中遇到个需求,在处理合同数据中,需要将数字金额进行转换成大写的形式。当时也找了不少资料。实现到了最大单位京的转换,我觉得这个很有意义,说不定下次用上记录下。
package com.panda.apps.beitou.utils;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
@Component
public class ChineseCurrencyFormatter {
private static final char[] CHINESE_NUM = {'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'};
private static final String[] CHINESE_UNIT = {"", "拾", "佰", "仟"};
private static final String[] BIG_UNIT = {"", "万", "亿", "兆", "京"};
public static String convertToChineseCurrency(BigDecimal amount) {
if (amount.compareTo(BigDecimal.ZERO) == 0) {
return "零元整";
}
StringBuilder sb = new StringBuilder();
long yuan = amount.longValue(); // 整数部分
int decimal = amount.subtract(new BigDecimal(yuan)).multiply(new BigDecimal(100)).intValue(); // 小数部分
// 处理整数部分
if (yuan > 0) {
String yuanStr = Long.toString(yuan);
int length = yuanStr.length();
int groupCount = (length + 3) / 4; // 大单位组的数量
boolean zeroFlag = false; // 标记是否需要插入零
for (int i = 0; i < groupCount; i++) {
int start = length - (i + 1) * 4;
int end = length - i * 4;
String group = yuanStr.substring(Math.max(start, 0), end);
String chineseGroup = convertGroupToChinese(group);
if (!"零".equals(chineseGroup)) {
if (zeroFlag) {
sb.insert(0, "零");
zeroFlag = false;
}
sb.insert(0, chineseGroup + BIG_UNIT[i]);
} else {
zeroFlag = true;
}
}
sb.append("元");
}
// 处理小数部分
if (decimal == 0) {
if (yuan == 0) {
sb.append("零元整");
} else {
sb.append("整");
}
} else {
int jiao = decimal / 10; // 角
int fen = decimal % 10; // 分
if (jiao != 0) {
sb.append(CHINESE_NUM[jiao]).append("角");
}
if (fen != 0) {
sb.append(CHINESE_NUM[fen]).append("分");
}
}
return sb.toString();
}
private static String convertGroupToChinese(String group) {
StringBuilder sb = new StringBuilder();
int len = group.length();
for (int i = 0; i < len; i++) {
int num = group.charAt(i) - '0';
if (num > 0) {
sb.append(CHINESE_NUM[num]).append(CHINESE_UNIT[len - 1 - i]);
} else {
if (sb.length() > 0 && sb.charAt(sb.length() - 1) != '零') {
sb.append("零");
}
}
}
if (sb.length() > 0 && sb.charAt(sb.length() - 1) == '零') {
sb.deleteCharAt(sb.length() - 1);
}
return sb.toString();
}
//
public static void main(String[] args) {
//伍角陆分
System.out.println(convertToChineseCurrency(new BigDecimal("0.56")));
// 壹元伍角陆分
System.out.println(convertToChineseCurrency(new BigDecimal("1.56")));
//零元整
System.out.println(convertToChineseCurrency(new BigDecimal("0")));
//玖仟玖佰玖拾玖兆玖仟玖佰玖拾玖亿玖仟玖佰玖拾玖万玖仟玖佰玖拾玖元柒角捌分
System.out.println(convertToChineseCurrency(new BigDecimal("9999999999999999.78")));
}
}
千京以上数据可能会出问题,也没时间调了,希望各位大佬可以修改,指点哈哈哈。又要加班了,不想上班了。