近期做了一个项目,里面有关于财务的部分,财务有时候需要将数字转为中文大写,在网上也搜了几篇文章,但是有很多都是只能转换部分数据,有的带小数的不能转换,有的末尾都是零的不能转换,本人整将从网上借鉴的代码进行了逻辑重新处理,供大家参考,有不对的地方,还请指正。以下是代码部分。
//定义需要用到的中文文字
private static final String[] CHINESE_NUMBERS = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
private static final String[] UNITS = {"", "拾", "佰", "仟"};
private static final String[] BIG_UNITS = {"", "万", "亿", "兆",};
//调用方法
public String convertToChinese(BigDecimal price) {
if (price == null || price.compareTo(BigDecimal.ZERO) == 0) {
return "零";
}
String firstNumber = "";
if (price.compareTo(BigDecimal.ZERO) < 0) {
firstNumber = "负";
}
// 转换为字符串并截取小数点前后部分
String priceStr = price.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString();
String integerPart = priceStr.split("\\.")[0]; // 整数部分
String decimalPart = priceStr.split("\\.")[1]; // 小数部分(角、分)
// 处理整数部分
String integerChinese = convertToChinesePart(integerPart, UNITS, BIG_UNITS);
// 处理小数部分
String decimalChinese = "";
if (!"00".equals(decimalPart)) {
decimalChinese = convertToDecimalChinese(decimalPart);
// 合并结果
return firstNumber + integerChinese + "元" + decimalChinese;
} else {
// 合并结果
return firstNumber + integerChinese + "元整";
}
}
//整数部分处理
private String convertToChinesePart(String numberStr, String[] units, String[] bigUnits) {
if ("0".equals(numberStr)) {
return CHINESE_NUMBERS[0];
}
StringBuilder sb = new StringBuilder();
int unitIndex = 0;
int zeroCount = 0;
for (int i = numberStr.length() - 1; i >= 0; i--) {
int digit = numberStr.charAt(i) - '0';
String chineseDigit = CHINESE_NUMBERS[digit];
if (digit == 0) {
zeroCount++;
// 连续零的处理:只在非零数字后面、单位变化处或字符串开始处添加一个零
if (sb.length() > 0 && (sb.charAt(sb.length() - 1) != CHINESE_NUMBERS[0].charAt(0) || unitIndex == 0 || i == 0)) {
sb.insert(0, chineseDigit);
}
} else {
// 添加非零数字和对应单位
sb.insert(0, chineseDigit + units[unitIndex]);
// zeroCount = 0; // 重置连续零的计数
}
// 切换到下一个单位
if (++unitIndex == units.length) {
if (unitIndex == zeroCount) {
sb.insert(0, bigUnits[(numberStr.length() - i) / units.length]);
} else if (sb.length() > 0 && i > 0) {
sb.insert(0, bigUnits[(numberStr.length() - i) / units.length]);
}
unitIndex = 0; // 循环使用单位数组
}
}
// 去除末尾可能多余的零
while (sb.length() > 0 && sb.charAt(0) == CHINESE_NUMBERS[0].charAt(0)) {
sb.deleteCharAt(0);
}
//处理除了高位都是零的数字
if (zeroCount == numberStr.length() - 1) {
sb = new StringBuilder(sb.toString().replace("零", ""));
if(sb.toString().contains("亿")){
sb=new StringBuilder(sb.toString().replace("万", ""));
}
}
return sb.toString();
}
//小数部分处理
private String convertToDecimalChinese(String decimalPart) {
StringBuilder sb = new StringBuilder();
if (decimalPart.charAt(0) != '0') {
sb.append(CHINESE_NUMBERS[decimalPart.charAt(0) - '0']).append("角");
}
if (decimalPart.length() > 1 && decimalPart.charAt(1) != '0') {
sb.append(CHINESE_NUMBERS[decimalPart.charAt(1) - '0']).append("分");
}
return sb.toString();
}
可以把此部分代码封装到工具类中,在需要装大写的地方调用convertToChinese方法,即可得将一个数字转为大写。
5696

被折叠的 条评论
为什么被折叠?



