1. 核心解决方案
    通过 自定义序列化器 + @JsonSerialize 注解,实现 BigDecimal 到百分比字符串的自动转换。
    1.1 自定义序列化器代码
    java
    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.text.DecimalFormat;
    import java.text.DecimalFormatSymbols;
    import java.util.Locale;

/**

  • 将 BigDecimal 序列化为百分比字符串(如 0.85 → “85.00%”)
    */
    public class BigDecimalPercentSerializer extends JsonSerializer {
    private static final DecimalFormat PERCENT_FORMAT;

    static {
    PERCENT_FORMAT = new DecimalFormat(“0.00%”); // 格式化为 2 位小数
    PERCENT_FORMAT.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.CHINA)); // 中文环境
    }

    @Override
    public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider provider) throws IOException {
    if (value == null) {
    gen.writeNull(); // 处理 null 值
    } else {
    gen.writeString(PERCENT_FORMAT.format(value)); // 输出带 % 的字符串
    }
    }
    }
    1.2 在 DTO 字段上使用注解
    java
    import com.fasterxml.jackson.databind.annotation.JsonSerialize;

@Data
public class MyDTO {
@JsonSerialize(using = BigDecimalPercentSerializer.class)
private BigDecimal completionRate; // 0.85 → “85.00%”
}

  1. 关键点解析
    2.1 为什么不用 @JsonFormat?
    ● @JsonFormat(pattern = “0.00%”) 不生效,因为它仅支持基本数字格式化,无法自动添加 % 符号。
    ● 自定义序列化器可以完全控制输出格式。
    2.2 线程安全性
    ● DecimalFormat 非线程安全,但通过 static 初始化 + 局部使用,可避免并发问题。
    如果项目要求严格线程安全,可用 ThreadLocal 包装:
    ● java
    private static final ThreadLocal PERCENT_FORMAT = ThreadLocal.withInitial(() -> {
    DecimalFormat df = new DecimalFormat(“0.00%”);
    df.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.CHINA));
    return df;
    });
    2.3 支持多语言环境
    ● 通过 Locale.CHINA 确保小数点、百分号符合中文习惯(如 85.00% 而非 85,00%)。
    ● 如果需要国际化,可从请求头获取 Locale 动态调整(需额外逻辑)。

  2. 进阶优化
    3.1 封装自定义注解(可选)
    若多处使用,可定义 @PercentFormat 注解简化代码:
    java
    import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
    import com.fasterxml.jackson.databind.annotation.JsonSerialize;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = BigDecimalPercentSerializer.class)
public @interface PercentFormat {}
使用方式:
java
@Data
public class MyDTO {
@PercentFormat // 替代 @JsonSerialize(using = …)
private BigDecimal completionRate;
}
3.2 处理特殊情况
● 科学计数法:如果 BigDecimal 值可能极小(如 1E-4),需在序列化器中增加处理逻辑。
● 自定义小数位数:通过注解参数动态指定格式(如 @PercentFormat(scale = 1))。

  1. 其他相关技巧
    4.1 反序列化(百分比字符串 → BigDecimal)
    若需要从 “85%” 转回 BigDecimal,可自定义 JsonDeserializer:
    java
    public class PercentToBigDecimalDeserializer extends JsonDeserializer {
    @Override
    public BigDecimal deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
    String text = p.getText().replace(“%”, “”);
    return new BigDecimal(text).divide(BigDecimal.valueOf(100));
    }
    }

// 在 DTO 中使用
public class MyDTO {
@JsonDeserialize(using = PercentToBigDecimalDeserializer.class)
private BigDecimal completionRate;
}
4.2 结合 MapStruct 使用
如果项目用了 MapStruct 做对象映射,可在接口中声明格式转换:
java
@Mapper
public interface MyMapper {
@Mapping(target = “completionRate”, qualifiedByName = “toPercent”)
MyDTO toDto(MyEntity entity);

@Named("toPercent")
static String toPercent(BigDecimal value) {return new DecimalFormat("0.00%").format(value);
}

}

  1. 总结
    方案 优点 适用场景
    @JsonSerialize 纯注解、无需改业务代码 简单字段级格式化
    自定义注解 @PercentFormat 代码更简洁,团队统一风格 项目中有大量百分比字段
    反序列化支持 完整双向转换 需要接收前端百分比字符串的场景
    推荐选择:
    ● 优先用 @JsonSerialize,够用且灵活。
    ● 大量同类字段时,升级为自定义注解。

附:常见问题
❓ Q: 能直接用 @JsonFormat 吗?
→ 不能,它的 pattern 不支持百分比符号自动转换。
❓ Q: 线程安全如何保证?
→ 用 static final 或 ThreadLocal 包装 DecimalFormat。
❓ Q: 如何动态调整小数位数?
→ 通过注解参数传递(如 @PercentFormat(scale = 1)),在序列化器内解析。

保存此笔记,随时查阅! ✨

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89763.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89763.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/89763.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大语言模型LLM在训练/推理时的padding

讨论的是在训练大型语言模型(Transformer-based models,比如GPT等)时,文本序列的填充(padding)问题,即训练和推理时分辨填充在序列的左侧(left padding)或右侧&#xff0…

50 个常用 Docker 命令

1. Docker 基础命令 查看 Docker 版本 docker --version查看 Docker 运行状态 systemctl status docker查看 Docker 信息 docker info查看帮助信息 docker help2. 镜像管理 拉取镜像 docker pull <镜像名>查看本地镜像 docker images删除镜像 docker rmi <镜…

纹理贴图算法研究论文综述

纹理贴图&#xff08;Texture Mapping&#xff09;是计算机图形学和计算机视觉中的核心技术&#xff0c;广泛应用于三维重建、游戏渲染、虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;等领域。对其算法的研究涵盖了纹理生成、映射、缝合、优化等多个…

关于使用cursor tunnel链接vscode(避免1006 issue的做法)

详细步骤 第 1 步&#xff1a;在你的本地机器上准备好 Cursor 这一步很简单&#xff0c;你可能已经完成了。只需确保你的本地电脑上已经安装了 Cursor 桌面应用程序。 要做的事&#xff1a;无&#xff0c;只需确保 Cursor 已安装。 第 2 步&#xff1a;在远程服务器上安装 Curs…

Redis常见性能问题和解决方案有哪些

Redis 作为高性能的内存数据库&#xff0c;在电商等高并发场景中广泛使用&#xff0c;但可能因配置、使用不当或环境限制出现性能问题。以下是 Redis 常见的性能问题及其解决方案&#xff0c;结合电商场景&#xff0c;用中文简洁说明&#xff1a;### 1. **高延迟&#xff08;响…

明远智睿RK3588:创新了高性能,让顾虑烟消云散

在科技浪潮的推动下&#xff0c;高性能开发已经成为众多行业发展的核心驱动力。从智能交通的车路协同&#xff0c;到医疗领域的影像诊断&#xff1b;从智能家居的智能控制&#xff0c;到工业互联网的智能制造&#xff0c;每一个领域都对模块的性能提出了极高的要求。然而&#…

I Data Lab

万事开头难&#xff0c;尤其是和 0 与 1 打交道&#xff0c;和后面的实验相比&#xff0c;这次只能算个热身。但是喜欢运动的都知道&#xff0c;热身很重要&#xff01;任务目标我们先来看看 Datalab 需要我们做什么。主要是通过这次的作业来熟悉整型及浮点数的位表达形式&…

SQLite 安装使用教程

一、SQLite 简介 SQLite 是一个轻量级的关系型数据库管理系统&#xff0c;嵌入式、零配置、无需安装服务器&#xff0c;广泛应用于移动端开发&#xff08;如 Android&#xff09;、桌面应用、小型网站等场景。 二、下载安装 2.1 官方网站下载 访问 SQLite 官网 下载适用于操…

Python-Word文档、PPT、PDF以及Pillow处理图像详解

Python操作Word和PowerPoint文件操作Word文档命令来安装python-docx三方库。pip install python-docxfrom docx import Document from docx.shared import Inches, Pt, RGBColor from docx.enum.text import WD_ALIGN_PARAGRAPH from docx.enum.table import WD_TABLE_ALIGNMEN…

高可扩展属性建模设计:架构师的全局思考与落地方案

在复杂业务系统中&#xff0c;动态属性扩展始终是架构设计的核心难题之一。传统方案如宽表设计和EAV&#xff08;实体-属性-值&#xff09;模型分别在性能与扩展性上各有优势与劣势&#xff0c;但也都有明显局限。 为了兼顾性能、扩展性、维护成本&#xff0c;需要引入更灵活的…

数据结构入门:链表

链式存储结构通过使用指针将分散的存储单元链接起来&#xff0c;每个元素由数据部分和指针部分组成。 链式表的定义和特点 链式表的每个节点包含两个部分&#xff1a; 数据域&#xff1a;存储数据元素。指针域&#xff1a;存储下一个节点的内存地址。 链式表的头指针指向第一个…

达梦数据库DMHS介绍及安装部署

目录 概述 安装规划 安装步骤 上传安装包 更改权限 执行安装命令 源端和目的端处理 开启归档 开启逻辑日志 创建测试表 生成测试数据 配置目的端文件 配置源端文件 启动目的端 启动源端 装载数据 源端开启cpt模块 数据同步验证 随机数据验证 概述 达梦数据实时同…

BERT 模型详解:结构、原理解析

前言 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;已经成为理解类任务的标配模型。相比 GPT 更擅长文本生成&#xff0c;BERT 则在语言理解任务上展现出卓越的能力。本文…

一、bfv_basics

目录 一、加密参数 EncryptionParameters类1. 三个重要的参数2. 参数的作用3. 同态加密方案4. 多项式模数的度 poly_modulus_degree (n)5. 密文模数 coeff_modulus (q)6. 明文模数 plain_modulus (t&#xff0c;这是 BFV 方案才有的&#xff0c;CKKS 没有) 二、上下文 SEALCont…

AI大模型LangChain架构介绍及其在环保领域的应用

1.LangChain 概述与架构 LangChain 是一个面向大型语言模型&#xff08;LLM&#xff09;应用的开发框架&#xff0c;其核心理念是将复杂的基于语言的 AI 系统拆分为可复用的模块&#xff0c;简化 LLM 与数据源的集成。LangChain 官方文档将其定义为“一个用于开发以 LLM 为驱动…

centos 7 安装NVIDIA Container Toolkit

要在 CentOS 7 上离线安装 NVIDIA Container Toolkit&#xff0c;需确保已安装 NVIDIA 驱动和 Docker 环境。以下是完整步骤及注意事项&#xff1a; ⚙️ 一、环境准备 验证 NVIDIA 驱动 运行 nvidia-smi 确认驱动已正确安装&#xff0c;若未安装需先离线安装驱动&#xff1a; …

C++学习之STL学习:list的使用

本篇我们将学习STL中list的使用 目录 list的初始和官方文档 list的官方文档 list的构造与析构 构造函数 析构函数 运算符重载 迭代器 正向迭代器 反向迭代器 const正向迭代器 const反向迭代器 容量 empty size max_size 访问 访问第一个元素​编辑 访问最后一个元素 修…

USB服务器在证券公司虚拟化进程中的应用分析

在证券公司全面拥抱虚拟化、云化的技术浪潮中&#xff0c;一个看似微小却至关重要的环节曾长期阻碍进程&#xff1a;分散在各业务环节的银行前置机U盾、各种系统认证Ukey等物理USB安全设备的管理难题。这些承载着资金划拨、交易认证核心权限的“小钥匙”&#xff0c;在传统模式…

网闸内部架构设计:分层与微服务的生死博弈

引言 “物理隔离是网闸的命脉,而架构设计决定其生死。” 在数据安全领域,网闸(安全隔离与信息交换系统)是守护核心网络的钢铁长城。但当开发者试图将现代架构思想(如微服务)引入其内部时,却可能引发灾难性冲突。本文通过深度拆解分层架构与微服务在网闸中的适用性,揭示…

通过MaaS平台免费使用大模型API

文章目录 一、引言&#xff1a;MaaS平台——免费使用大模型API的新选择二、模型代码与限制术语详解&#xff08;一&#xff09;模型代码含义解析&#xff08;二&#xff09;模型使用限制术语缩写详解 三、5个MaaS平台详细介绍&#xff08;一&#xff09;OpenRouter&#xff08;…