像商品价格,订单,结算都会涉及到一些金额的问题,为了避免精度丢失通常会做一些处理,常规的系统中金额一般精确到小数点后两位,也就是分;
这样数据库在设计的时候金额就直接存储整型数据类型,前端可以将金额X100以分为单位传给后端,后端进行一系列逻辑处理后要以元为单位返回前端直接展示,
这时候就可以定义一个简单的处理工具来转换:
public class MoneyConvert<T> { //分转换为元,返回string类型 public String centToDollarForString(T t){ if (t == null) { return "0"; } else { BigDecimal amount = getBigDecimal(t); amount = amount.divide(new BigDecimal(100)); return amount.toString(); } } //分转换为元,返回double类型 public Double centToDollarForDouble(T t){ if (t == null) { return 0D; } else { BigDecimal amount = getBigDecimal(t); amount = amount.divide(new BigDecimal(100)); return amount.doubleValue(); } }
private BigDecimal getBigDecimal(T t) { BigDecimal amount; if(t instanceof Integer){ amount = new BigDecimal(t.toString()); } else if(t instanceof Long){ amount = new BigDecimal(t.toString()); } else if(t instanceof String){ amount=new BigDecimal(t.toString()); } else{ throw new RuntimeException(String.format("不支持的数据类型,%s",t.getClass())); } return amount; }
} //转换类
public class IntegerCentToStringDollar extends JsonSerializer<Integer> { @Override public void serialize(Integer value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException { gen.writeNumber(new MoneyConvert<Integer>().centToDollarForString(value)); } }
import com.blogs.common.utils.IntegerCentToStringDollar; import com.fasterxml.jackson.databind.annotation.JsonSerialize; //在需要处理的字段上加上注解@JsonSerialize(using = IntegerCentToStringDollar.class) public class TestVo { private Integer id; @JsonSerialize(using = IntegerCentToStringDollar.class) private Integer money; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getMoney() { return money; } public void setMoney(Integer money) { this.money = money; } }
@RestController public class Demo { @RequestMapping("/test") public TestVo testMoneyConvert(){ TestVo vo=new TestVo(); vo.setId(1); vo.setMoney(123); return vo; } } //结果展示: