我是靠谱客的博主 任性小虾米,这篇文章主要介绍BigDecimal类型字段返回JSON格式数据时自定义保留几位小数,现在分享给大家,希望可以做个参考。

大家做项目的时候肯定或多或少遇到过这样的经历:比如有个字段rate(表示汇率),它在数据中的保存的类型是decimal(19, 12),那么尽管你的rate=6.1234,但是当存到数据库的时候也会给你的小数位自动补零,一直到小数位达到12位,如下:

这样如果需要在接口中返回给调用方这个字段,但是在接口中又没做处理的话,那返回的就是这个后面自动补零的数据。

如果调用方说,你别给我这么多小数位,我只要小数点后保留六位就行了,那该怎处理呢?

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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之前,都自己手动处理一下:

复制代码
1
2
3
4
5
6
BigDecimal rate = new BigDecimal("6.943200000000"); // 假设这就是你从数据查询返回的rate /**下面进行进度处理,这里选择的是保留6位小数,采用四舍五入法*/ rate = rate.setScale(6, RoundingMode.HALF_UP); // 返回给调用方 RateVO resp = new RateVO(); resp.setRate(rate);

这样做是可以满足要求,但是如果数据库中返回的decimal类型比较多,那么每次都需要这样处理,显得不够优雅,那么怎么优雅的处理这种返回的数据呢?

下面我们自己定义一个序列化的类,继承 JsonSerializer,在里面定制我们序列化的规则。如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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了,如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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格式数据时自定义保留几位小数内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(76)

评论列表共有 0 条评论

立即
投稿
返回
顶部