涉及银行、保险行业金额运算,一般都会使用Bigdecimal类型,但是处理数据的位数,比如给大数据加千分位、数据的四舍五入等情况,经常令人头疼。
下面的工具类,拿走即用,解决90%的问题
import com.ctrip.framework.apollo.core.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import java.math.BigDecimal;
import java.math.RoundingMode;
/**
* @Description: 金额格式化工具类
* @Param:
* @return:
* @Author:
* @Date: 2023/6/28 16:31
*/
@Slf4j
public class MoneyUtil {
/**
* 金额格式化:
* 1)如有小数点,精确到小数点后2位,四舍五入;
* 2) 没小数点,按整数显示;
* 3)整数部分超过3位的,每三位用半角逗号分割
*
* @param amount
* @return
*/
public static String convert(String amount) {
if (StringUtils.isEmpty(amount)) {
return null;
}
if (amount.contains(".")) {
//先四舍五入,避免进位取整
amount = rounding(amount);
if (amount.contains(".")) {
String addCommaStr = amount.substring(0, amount.indexOf("."));
String tmpCommaStr = amount.substring(amount.indexOf("."));
return addComma(addCommaStr) + tmpCommaStr;
} else {
return addComma(amount);
}
} else {
return addComma(amount);
}
}
/**
* 科学计数法处理,每三位用半角逗号分割
*
* @param amount
* @return
*/
public static String addComma(String amount) {
String reverseStr = new StringBuilder(amount).reverse().toString();
String strTemp = "";
for (int i = 0; i < reverseStr.length(); i++) {
if (i * 3 + 3 > reverseStr.length()) {
strTemp += reverseStr.substring(i * 3, reverseStr.length());
break;
}
strTemp += reverseStr.substring(i * 3, i * 3 + 3) + ",";
}
if (strTemp.endsWith(",")) {
strTemp = strTemp.substring(0, strTemp.length() - 1);
}
String resultStr = new StringBuilder(strTemp).reverse().toString();
return resultStr;
}
/**
* 四舍五入处理,保留两位小数(.00小数位除外)
*
* @param amount
* @return
*/
public static String rounding(String amount) {
BigDecimal num1 = new BigDecimal(amount);
num1 = num1.setScale(2, RoundingMode.HALF_UP);
BigDecimal num2 = num1.setScale(0, RoundingMode.DOWN);
//如果带小数跟取整相同,则取整,去掉.00小数位
if (num1.compareTo(num2) == 0) {
return String.valueOf(num2);
}
return String.valueOf(num1);
}
}