概述
大家做项目的时候肯定或多或少遇到过这样的经历:比如有个字段rate(表示汇率),它在数据中的保存的类型是decimal(19, 12),那么尽管你的rate=6.1234,但是当存到数据库的时候也会给你的小数位自动补零,一直到小数位达到12位,如下:
这样如果需要在接口中返回给调用方这个字段,但是在接口中又没做处理的话,那返回的就是这个后面自动补零的数据。
如果调用方说,你别给我这么多小数位,我只要小数点后保留六位就行了,那该怎处理呢?
package com.test.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.math.BigDecimal;
@ApiModel(value = "汇率实体", description = "查询返回的汇率实体")
public class RateVO {
@ApiModelProperty(value = "汇率", name = "rate", example = "7.123456")
private BigDecimal rate;
public BigDecimal getRate() {
return rate;
}
public void setRate(BigDecimal rate) {
this.rate = rate;
}
}
最简单粗暴的方法,就是每次从数据库取到rate,set到RateVO之前,都自己手动处理一下:
BigDecimal rate = new BigDecimal("6.943200000000"); // 假设这就是你从数据查询返回的rate
/**下面进行进度处理,这里选择的是保留6位小数,采用四舍五入法*/
rate = rate.setScale(6, RoundingMode.HALF_UP);
// 返回给调用方
RateVO resp = new RateVO();
resp.setRate(rate);
这样做是可以满足要求,但是如果数据库中返回的decimal类型比较多,那么每次都需要这样处理,显得不够优雅,那么怎么优雅的处理这种返回的数据呢?
下面我们自己定义一个序列化的类,继承 JsonSerializer,在里面定制我们序列化的规则。如下:
package com.test.utils;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class MySerializer extends JsonSerializer<BigDecimal> {
@Override
public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (value != null) {
/**在这里定制我们需要格式化的逻辑*/
// 比如保留六位小数,四舍五入
BigDecimal number = value.setScale(6, RoundingMode.HALF_UP);
gen.writeNumber(number);
} else {
gen.writeNumber(value);
}
}
}
接下来只要在返回的实体类VO中,在要格式化的字段上面加上@JsonSerialize(using = MySerializer.class)注解就OK了,如下:
package com.test.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.test.utils.MySerializer;
import java.math.BigDecimal;
@ApiModel(value = "汇率实体", description = "查询返回的汇率实体")
public class RateVO {
@JsonSerialize(using = MySerializer.class) // 使用我们自定义的序列化类
@ApiModelProperty(value = "汇率", name = "rate", example = "7.123456")
private BigDecimal rate;
public BigDecimal getRate() {
return rate;
}
public void setRate(BigDecimal rate) {
this.rate = rate;
}
}
最后
以上就是任性小虾米为你收集整理的BigDecimal类型字段返回JSON格式数据时自定义保留几位小数的全部内容,希望文章能够帮你解决BigDecimal类型字段返回JSON格式数据时自定义保留几位小数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复