天天看點

如何優雅把分不失精度轉換成元

公司前後端協定,後端資料庫中對于價格落庫的時候統一機關: 分,通過接口傳回給前端則統一轉換成元,比如商品價格25.68,資料庫落庫則是2568,但是接口給前端傳回則需要25.68;

在轉換的過程中需要注意精度的丢失,是以直接摒棄double,float采用BigDecimal類型,當然你寫個方法類,裡面加上下面的方法:

private static final BigDecimal DIVIDENUM = new BigDecimal(100);

    private static final String DEFAULT_VALUE = "0";

    public static String RMBFenToYuan(Integer fen){
        return  Objects.isNull(fen) ? DEFAULT_VALUE : new BigDecimal(fen).divide(DIVIDENUM).toString();
    }
           

然後每次在有需要的時候調用即可。

如果你想B格稍微高一些,走路帶點風的話,你還可以這麼實作:

final public class FenToYuanForRMB extends JsonSerializer<Integer> {
    private static final BigDecimal DIVIDENUM = new BigDecimal(100);

    private static final String DEFAULT_VALUE = "0";

    @Override
    public void serialize(Integer fen, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        String yuan = Objects.isNull(fen) ? DEFAULT_VALUE : new BigDecimal(fen).divide(DIVIDENUM).toString();
        jsonGenerator.writeString(yuan);
    }
}

           

然後隻需要在給前端的接口的實體類中相關字段的get方法加上注解

@JsonSerialize(using = IntegerFenToStringYuan.class)

具體用法:

@ApiModel
public class Test implements Serializable {

    @ApiModelProperty("價格")
    private Integer price;
    
    @JsonSerialize(using = FenToYuanForRMB.class)
    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }
}
           

哈哈,其實效果是一樣的,後面方法用的人應該少些,是以會稍顯B格,反正我是這麼認為的!