当前位置: 首页 > 后端技术 > Java

java-2自定义注解+1个工具类对小数类型字段进行四舍五入

时间:2023-04-01 15:37:16 Java

在java中有时候需要对返回给前端的数据进行统一格式化。例如,小数类型的字段需要格式化为保留两位小数的舍入格式;这里使用了两个注解:一个注解类,一个注解字段,在返回之前使用工具类的方法调用一次就完成了这个目的。1.类上标注的注解@RoundMarkpackagecom.niewj.common.annotation;importjava.lang.annotation.*;/***数学领域需要格式化的类标注注解**@authorniewj*@date2023/3/816:03*/@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceRoundMark{}2。注解@Roundpackage标记在字段com.niewj.common.annotation;importjava.lang.annotation.*;/***实体字段格式:float/double/decimal字段四舍五入到小数点后2位(默认)**@authorniewj*@date2023/3/816:03*/@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceRound{intvalue()default2;}3.注解的使用包com.niewj.business。model;importcom.niewj.common.annotation.Round;importcom.niewj.common.annotation.RoundMark;importlombok.Data;importjava.math.BigDecimal;/***详细数据**@authorniewj*@date2023-02-12*/@Data@RoundMark公共类DataReturnToFront{/***产品skuid*/私人长skuId;/***产品总体积*/privateLongcount;/***平均产品曝光率*/@RoundprivateDoubleavgExp;/***平均产品曝光率——与昨天相比*/@RoundprivateDoubleavgExpDodRatio;/***产品平均曝光-(new)*/@RoundprivateDoubleavgExpIncrement;/***产品[平均曝光]-与昨天相比-新*/@RoundprivateDoubleavgExpIncrementDodRatio;/***商品[平均营业额]*/@RoundprivateDoubleavgSaleAmt;/***商品[平均营业额]-环比(昨天)*/@RoundprivateDoubleavgSaleAmtDodRatio;/***商品[平均营业额]-newIncrease*/@RoundprivateFloatavgSaleAmtIncrement;/***Control[AverageTurnover]-Ring(Yesterday)-Add*/@RoundprivateBigDecimalavgSaleAmtIncrementDodRatio;}4.标注处理,工具:packagecom.niewj.common.util;importcom.niewj.common.annotation。圆形;导入com.niewj.common.annotation.RoundMark;导入lombok.extern.slf4j.Slf4j;导入org.springframework.util.CollectionUtils;导入java.lang。反映。场地;importjava.math.BigDecimal;importjava.math.RoundingMode;importjava.util.Arrays;importjava.util.List;/***注解工具类:用于为实体对象Processing对象在类和字段上标注注解*/@Slf4jpublicclassAnnotationUtil{/***遍历格式化列表List中元素对象的number字段**@paramtargetList待处理的数据集合*@param*/publicstaticvoidroundListItemFields(ListtargetList){if(CollectionUtils.isEmpty(targetList)){log.info("targetList为空,无需处理");返回;}targetList.stream().forEach(e->{roundDecimalValues(e);});}/***以十进制格式对数据进行四舍五入:类上用@RoundMark标记的数据/字段上用@Round标记的数据进行四舍五入**@paramtarget待处理的实体对象*@param*/publicstaticvoidroundDecimalValues(Ttarget){类targetClass=target.getClass();booleanhasRoundingNumberAnno=targetClass.isAnnotationPresent(RoundMark.class);如果(有圆形ingNumberAnno){//处理属性的字段值roundDecimalField(targetClass,target);}}/***为目标类中的每个字段匹配字段注解,如果匹配则向上取整**@paramtargetClass标记Round注解类*@paramtarget类的实例对象——即所在的对象要处理的字段*@param*/privatestaticvoidroundDecimalField(ClasstargetClass,Ttarget){Field[]fields=targetClass.getDeclaredFields();Arrays.stream(fields).forEach(field->{booleanhasRoundingNumberAnno=field.isAnnotationPresent(Round.class);if(hasRoundingNumberAnno){//获取注解值intscale=field.getAnnotation(Round.class).value();对象originFieldVal;对象roundedFieldVal;尝试{field.setAccessible(true);originFieldVal=field.get(target);if(originFieldValinstanceofFloat){BigDecimal值=newBigDecimal(String.valueOf(originFieldVal)).setScale(scale,RoundingMode.HALF_UP);roundedFieldVal=value.floatValue();}elseif(originFieldValinstanceofDouble){BigDecimalvalue=newBigDecimal(String.valueOf(originFieldVal)).setScale(scale,RoundingMode.HALF_UP);roundedFieldVal=value.doubleValue();}elseif(originFieldValinstanceofBigDecimal){roundedFieldVal=newBigDecimal(String.valueOf(originFieldVal)).setScale(scale,RoundingMode.HALF_UP);}else{roundedFieldVal=originFieldVal;}field.set(target,roundedFieldVal);}catch(IllegalAccessExceptione){e.printStackTrace();}}});}}5.使用方式:controller端@GetMapping("/test")@ResponseBody@RecCostTimepublicListtest(){log.info("======================");DataReturnToFrontdetail=newDataReturnToFront();detail.setSkuId(233230L);detail.setCount(0L);detail.setAvgExp(2220.1234566D);detail.setAvgExpDodRatio(2220.1254566D);detail.setAvgExpIncrement(-2220.1254566D);detail.setAvgExpIncrementDodRatio(-2220.1264566D);detail.setAvgSaleAmt(2220.1234566D);detail.setAvgSaleAmtDodRatio(2220.1254566D);detail.setAvgSaleAmtIncrement(2220.1254566F);detail.setAvgSaleAmtIncrementDodRatio(BigDecimal.valueOf(0.1234566D));DataReturnToFrontdetail2=newDataReturnToFront();detail2.setSkuId(5230L);detail2.setCount(2330L);detail2.setAvgExp(20.135634566D);detail2.setAvgExpDodRatio(22.55554566D);detail2.setAvgExpIncrement(-2220.5555D);detail2.setAvgExpIncrementDodRatio(-2220.5555D);detail2.setAvgSaleAmt(2220.5555D);detail2.setAvgSaleAmtDodRatio(2220.5555D);detail2.setAvgSaleAmtIncrement(2220.5555F);detail2.setAvgSaleAmtIncrementDodRatio(BigDecimal.valueOf(0.5555D));列表list=newArrayList();list.add(细节);list.add(细节2);//舍入格式-批处理AnnotationUtil.roundListItemFields(list);//单处理AnnotationUtil.roundDecimalValues(detail);返回列表;}roundDecimalValues是对标有@Round字段的单个对象的字段值进行取整修改(前提是类上有@RoundMark标示)。roundListItemFields就是遍历列表。