百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

Springboot全局配置实现BigDecimal返回前端去除小数点后多余的0

yuyutoo 2024-12-13 17:01 5 浏览 0 评论

一、前言

我们在使用BigDecimal来记录数值时,经常会有一个问题,就是小数点后多余的0!

当前如果你们是金额,保留两位小数,展示多余的0是没有问题的!可以看一下银行卡是会显示到分的!

小编的这里不是这种的,是要求保留八位小数,即使前端输入100.1。保存到数据库时就会变为:100.10000000,前端查询出来肯定就是100.10000000。非常的臃肿,我们就需要去掉一下!

二、解决方案

分为两种方案:

  • 按需进行去除0
  • 全局BigDecimal全部去除0

各有各的优缺点,就是看你们系统的要求了!

小编这里是有的允许保留0的,不需要的咱们单独处理。所以咱们先演示第一种!

1. 第一种方案

「编写自定义序列化器:BigDecimalSerializer」

/**
 * BigDecimal序列化器
 * @author wangzhenjun
 * @date 2023/5/17 16:29
 */
public class BigDecimalSerializer extends JsonSerializer<BigDecimal> {

 @SneakyThrows
 @Override
 public void serialize(BigDecimal bigDecimal, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) {
  if (null != bigDecimal ) {
   String plainString = bigDecimal.stripTrailingZeros().toPlainString();
   jsonGenerator.writeString(plainString);
  } else {
   jsonGenerator.writeString(BigDecimal.ZERO.toPlainString());
  }
 }
}

在需要的对象上添加注解@JsonSerialize即可:

/**
 * @author wangzhenjun
 * @date 2023/5/17 16:51
 */
@Data
public class Big {

    @JsonSerialize(using = BigDecimalSerializer.class)
    private BigDecimal price;
}

测试一下:

@GetMapping("/big")
public Result big(){
    Big big = new Big();
    big.setPrice(new BigDecimal("1.20"));
    return Result.success(big);
}



我们可以看到正常的去除多余的0,我们会发现原来的BigDecimal变为了字符串,其实这个也是正常的,在我们系统里会配置上,把Long和BigDecimal返回前端的时候都会变为字符串,防止精度丢失。

变字符串的配置,在这里就不多数了,大家可以看一下这篇文章!

后端统一处理返回前端日期LocalDateTime格式化去T,Long返回前端损失精度问题

想详细了解的可以看看文章,赶时间的,小编在下面给出来了,添加一个配置类即可!

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(ObjectMapper.class)
@AutoConfigureBefore(JacksonAutoConfiguration.class)
public class JacksonConfiguration {

 @Bean
 @ConditionalOnMissingBean
 public Jackson2ObjectMapperBuilderCustomizer customizer() {
  return builder -> {
   builder.locale(Locale.CHINA);
   builder.timeZone(TimeZone.getTimeZone(ZoneId.systemDefault()));
   // 设置日期格式
   builder.simpleDateFormat(DatePattern.NORM_DATETIME_PATTERN);
   // 解决long类型损失精度
   builder.serializerByType(Long.class, ToStringSerializer.instance);
   // 解决BigDecimal类型损失精度
   builder.serializerByType(BigDecimal.class, ToStringSerializer.instance);
   // 日期格式自定义类
   builder.modules(new PigJavaTimeModule());
  };
 }

}

2. 第二种方式

我们只需要进行序列化的时候去除一下即可,这是全局的BigDecimal都会去除多余0,大家按需使用,以免造成不必要的事故!

/**
 * 全局序列化配置
 * @author wangzhenjun
 * @date 2023/5/19 17:11
 */
@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addSerializer(BigDecimal.class, new JsonSerializer<BigDecimal>() {
            @Override
            public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
                if (value != null) {
                    gen.writeString(value.stripTrailingZeros().toPlainString());
                }
            }
        });
        objectMapper.registerModule(module);
        return objectMapper;
    }
}

我们再次测试,我把上一种方式的写法去掉了哈!



我们可以看到也是没有问题的哈!



三、总结

通过本篇博客的介绍,我们知道了两种解决方式! 可以对BigDecimal类型进行格式化,去除前端展示中多余的0。这样能够优化前端展示效果,提高用户体验。 这个两个方法都简单易用,而且具有通用性,适合大部分项目使用。

当然,在实际开发中,还有很多其他的格式化方式和技巧可以使用,比如使用前端框架的过滤器、使用JavaScript的toFixed()函数等等。不过,无论使用哪种方式,我们要做到的是尽可能地避免前端展示中出现多余的0,保证用户体验。

最最重要的是符合业务要求!

希望本篇博客的介绍能够对大家有所帮助,有什么问题或者建议,欢迎在下面留言。


如果对你有帮助,还请动一下您的发财小手,关注一下公众号哈!!谢谢您的关注!!文章首发看!!!


相关推荐

.NET 奇葩问题调试经历之3——使用了grpc通讯类库后,内存一直增长......

...

全局和隐式 using 指令详解(全局命令)

1.什么是全局和隐式using?在.NET6及更高版本中,Microsoft引入了...

请停止微服务,做好单体的模块化才是王道:Spring Modulith介绍

1、介绍模块化单体是一种架构风格,代码是根据模块的概念构成的。对于许多组织而言,模块化单体可能是一个很好的选择。它有助于保持一定程度的独立性,这有助于我们在需要的时候轻松过渡到微服务架构。Spri...

ASP.NET程序集引用之痛:版本冲突、依赖地狱等解析与实战

我是一位多年后端经验的工程师,其中前几年用ASP.NET...

.NET AOT 详解(.net 6 aot)

简介AOT(Ahead-Of-TimeCompilation)是一种将代码直接编译为机器码的技术,与传统的...

一款基于Yii2开发的免费商城系统(一款基于yii2开发的免费商城系统是什么)

哈喽,我是老鱼,一名致力于在技术道路上的终身学习者、实践者、分享者!...

asar归档解包(游戏arc文件解包)

要学习Electron逆向,首先要有一个Electron开发的程序的发布的包,这里就以其官方的electron-quick-start作为例子来进行一下逆向的过程。...

在PyCharm 中免费集成Amazon CodeWhisperer

CodeWhisperer是Amazon发布的一款免费的AI编程辅助小工具,可在你的集成开发环境(IDE)中生成实时单行或全函数代码建议,帮助你快速构建软件。简单来说,AmazonCodeWhi...

2014年最优秀JavaScript编辑器大盘点

1.WebstormWebStorm是一种轻量级的、功能强大的IDE,为Node.js复杂的客户端开发和服务器端开发提供完美的解决方案。WebStorm的智能代码编辑器支持JavaScript,...

基于springboot、tio、oauth2.0前端vuede 超轻量级聊天软件分享

项目简介:基于JS的超轻量级聊天软件。前端:vue、iview、electron实现的PC桌面版聊天程序,主要适用于私有云项目内部聊天,企业内部管理通讯等功能,主要通讯协议websocket。支持...

JetBrains Toolbox推出全新产品订阅授权模式

捷克知名软件开发公司JetBrains最为人所熟知的产品是Java编程语言开发撰写时所用的集成开发环境IntelliJIDEA,相信很多开发者都有所了解。而近期自2015年11月2日起,JetBr...

idea最新激活jetbrains-agent.jar包,亲测有效

这里分享一个2019.3.3版本的jetbrains-agent.jar,亲测有效,在网上找了很多都不能使用,终于找到一个可以使用的了,这里分享一下具体激活步骤,此方法适用于Jebrains家所有产品...

CountDownTimer的理解(countdowntomars)

CountDownTimer是android开发常用的计时类,按照注释中的说明使用方法如下:kotlin:object:CountDownTimer(30000,1000){...

反射为什么性能会很慢?(反射时为什么会越来越长)

1.背景前段时间维护一个5、6年前的项目,项目总是在某些功能使用上不尽人意,性能上总是差一些,仔细过了一下代码发现使用了不少封装好的工具类,工具类里面用了好多的反射,反射会影响到执行效率吗?盲猜了一...

btrace 开源!基于 Systrace 高性能 Trace 工具

介绍btrace(又名RheaTrace)是抖音基础技术团队自研的一款高性能AndroidTrace工具,它基于Systrace实现,并针对Systrace不足之处加以改进,核心改进...

取消回复欢迎 发表评论: