该注解可以固定保留一定位数的小数,并且可以去除后面多余的0
1.切点
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface BigDecimalScale {
int scale() default 2;
}
2.工具类
public class BigDecimalScaleUtil {
/**
* 设置一个对象中BigDecimal保留的小数位(只适合小数据集)
*
* @param o 对象实体
* @param stripTrailingZeros 是否去掉无效的0
*/
public static void setBigDecimalScale(Object o, boolean stripTrailingZeros) {
Class<?> clazz = o.getClass();
for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
BigDecimalScale bigDecimalScale = field.getAnnotation(BigDecimalScale.class);
if (bigDecimalScale == null) {
continue;
}
int scale = bigDecimalScale.scale();
try {
BigDecimal decimal = getBigDecimalFieldValueByName(field.getName(), o);
if (stripTrailingZeros) {
// setBigDecimalFieldValueByName(field.getName(), o, decimal == null ? null : decimal.setScale(scale, BigDecimal.ROUND_HALF_UP));
setBigDecimalFieldValueByName(field.getName(), o, decimal == null ? null : stripTrailingZeros(decimal, scale));
continue;
}
setBigDecimalFieldValueByName(field.getName(), o, decimal == null ? null : decimal.setScale(scale, BigDecimal.ROUND_HALF_UP));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
private static BigDecimal getBigDecimalFieldValueByName(String fieldName, Object o) throws Exception {
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String getter = "get" + firstLetter + fieldName.substring(1);
Method method = o.getClass().getMethod(getter);
return (BigDecimal) method.invoke(o);
}
private static void setBigDecimalFieldValueByName(String fieldName, Object o, BigDecimal value) throws Exception {
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String setter = "set" + firstLetter + fieldName.substring(1);
Method method = o.getClass().getMethod(setter, BigDecimal.class);
method.invoke(o, value);
}
private static BigDecimal stripTrailingZeros(BigDecimal param, int scale) {
return param.add(BigDecimal.ONE).setScale(scale, BigDecimal.ROUND_HALF_UP).stripTrailingZeros().subtract(BigDecimal.ONE);
}
}
3.使用方法
public class bigPo {
@BigDecimalScale
private BigDecimal b1;
public BigDecimal getB1() {
return b1;
}
public void setB1(BigDecimal b1) {
this.b1 = b1;
}
}
4.代码中开启
BigDecimalScaleUtil.setBigDecimalScale(bigPo, true);









网友评论