工具类14:BigDecimalScaleUtil

该注解可以固定保留一定位数的小数,并且可以去除后面多余的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);

你可能感兴趣的:(工具类14:BigDecimalScaleUtil)