BigDecimal类型字段返回JSON格式数据时自定义保留几位小数

大家做项目的时候肯定或多或少遇到过这样的经历:比如有个字段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;
    }

}

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值