Browse Source
重写金额大小写转换工具类:解决之前带角和分出现的多余值:零零角;解决例如.06和.60这种带小数的数值区分不了的问题 修改采购订单导出供应商合同后端接口,使用新的金额工具类dev
liuxiaoxu
2 months ago
2 changed files with 80 additions and 44 deletions
@ -1,61 +1,97 @@ |
|||
package com.ruoyi.common.utils; |
|||
|
|||
import java.math.BigDecimal; |
|||
import java.text.DecimalFormat; |
|||
|
|||
|
|||
/** |
|||
* 金额大小写转换 |
|||
* @author 刘晓旭 |
|||
* */ |
|||
public class MoneyUtils { |
|||
private static final String[] CHINESE_DIGITS = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}; |
|||
private static final String[] UNITS = {"", "拾", "佰", "仟", "万", "亿"}; |
|||
|
|||
public static String toChineseCapitalized(BigDecimal amount) { |
|||
if (amount == null || amount.compareTo(BigDecimal.ZERO) == 0) { |
|||
return "零元整"; |
|||
} |
|||
private static final String[] cnNums = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; // 汉字的数字
|
|||
private static final String[] cnIntRadice = { "", "拾", "佰", "仟" }; // 基本单位
|
|||
private static final String[] cnIntUnits = { "", "万", "亿", "兆" }; // 对应整数部分扩展单位
|
|||
private static final String[] cnDecUnits = { "角", "分"}; // 对应小数部分单位
|
|||
private static final String cnInteger = "整"; // 整数金额时后面跟的字符
|
|||
private static final String cnIntLast = "元"; // 整型完以后的单位
|
|||
|
|||
StringBuilder result = new StringBuilder(); |
|||
boolean isNegative = amount.signum() == -1; |
|||
amount = amount.abs(); |
|||
/** |
|||
* 金额大小写转换,将数字转换为汉字 |
|||
* @param money 支持最大16位整数2位小数 |
|||
* @return |
|||
*/ |
|||
public static String amountConversion(String money){ |
|||
//如果传入为空,则返回null
|
|||
if(StringUtils.isBlank(money)){ |
|||
return "null"; |
|||
} |
|||
String result = ""; |
|||
//整数部分
|
|||
String integer=""; |
|||
//小数部分
|
|||
String point=""; |
|||
if(money.matches("^[0-9]{0,16}|[0-9]{0,16}+([.]{0,1}[0-9]{0,2})$")){ |
|||
BigDecimal bigDecimal = new BigDecimal(money); |
|||
//对金额进行格式化,统一小数点后面保留两位。 此举能去除整数部分多余的0,以及小数部分统一保留两位 如:00456.1-->456.10
|
|||
money = new DecimalFormat("##0.00").format(bigDecimal); |
|||
//整数部分
|
|||
integer = money.split("\\.").length==1?money:money.split("\\.")[0]; |
|||
//小数部分
|
|||
point = money.split("\\.").length==1?"00":money.split("\\.")[1]; |
|||
|
|||
// 将金额转换为整数部分和小数部分
|
|||
long integerPart = amount.longValue(); |
|||
BigDecimal decimalPart = amount.remainder(BigDecimal.ONE).setScale(2, BigDecimal.ROUND_HALF_UP); |
|||
|
|||
// 处理整数部分
|
|||
int unitIndex = 0; |
|||
while (integerPart > 0) { |
|||
int digit = (int) (integerPart % 10); |
|||
if (digit != 0 || result.length() > 0) { // 避免多个"零"
|
|||
result.insert(0, UNITS[unitIndex]); |
|||
if("0".equals(integer)){ |
|||
result = "零"+cnIntLast; |
|||
}else{ |
|||
int zeroCount = 0; |
|||
char[] array = integer.toCharArray(); |
|||
String n=""; |
|||
int p=0,q=0,m=0; |
|||
for (int i = 0; i < integer.length(); i++) { |
|||
n = Character.toString(array[i]); |
|||
p = integer.length() - i - 1; |
|||
q = p / 4; |
|||
m = p % 4; |
|||
if (n.equals("0")) { |
|||
zeroCount++; |
|||
} else { |
|||
if (zeroCount > 0) { |
|||
result += cnNums[0]; |
|||
} |
|||
result.insert(0, CHINESE_DIGITS[digit]); |
|||
integerPart /= 10; |
|||
unitIndex++; |
|||
if (unitIndex == 4) { |
|||
unitIndex = 0; |
|||
result.insert(0, "万"); |
|||
zeroCount = 0; // 归零
|
|||
result += cnNums[Integer.parseInt(n)] + cnIntRadice[m]; |
|||
} |
|||
if (m == 0 && zeroCount < 4) { |
|||
result += cnIntUnits[q]; |
|||
} |
|||
} |
|||
result += cnIntLast; |
|||
} |
|||
|
|||
// 添加单位“元”
|
|||
result.append("元"); |
|||
|
|||
// 处理小数部分
|
|||
if (decimalPart.compareTo(BigDecimal.ZERO) > 0) { |
|||
result.append("零").append(CHINESE_DIGITS[decimalPart.intValue()]); |
|||
result.append("角"); |
|||
BigDecimal cents = decimalPart.remainder(BigDecimal.ONE).multiply(BigDecimal.TEN); |
|||
if (cents.compareTo(BigDecimal.ZERO) > 0) { |
|||
result.append("零").append(CHINESE_DIGITS[cents.intValue()]); |
|||
result.append("分"); |
|||
//组装小数部分
|
|||
if ("00".equals(point)) { |
|||
result += cnInteger; |
|||
}else{ |
|||
String n=""; |
|||
char[] array = point.toCharArray(); |
|||
for (int i = 0; i < point.length(); i++) { |
|||
n = Character.toString(array[i]); |
|||
if (!n.equals("0")) { |
|||
result += cnNums[Integer.parseInt(n)] + cnDecUnits[i]; |
|||
} |
|||
} |
|||
} else { |
|||
result.append("整"); |
|||
} |
|||
|
|||
if (isNegative) { |
|||
result.insert(0, "负"); |
|||
|
|||
}else{ |
|||
return "请检查金额(整数位不能超过16位,小数不能超过2位)"; |
|||
} |
|||
|
|||
return result.toString(); |
|||
return result; |
|||
} |
|||
|
|||
} |
|||
|
|||
|
|||
|
Loading…
Reference in new issue