我是靠谱客的博主 任性小虾米,最近开发中收集的这篇文章主要介绍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;
    }

}

 

最后

以上就是任性小虾米为你收集整理的BigDecimal类型字段返回JSON格式数据时自定义保留几位小数的全部内容,希望文章能够帮你解决BigDecimal类型字段返回JSON格式数据时自定义保留几位小数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部