@NumberFormat对BigDecimal失效,因其底层NumberFormat不支持直接转BigDecimal,且Spring未为BigDecimal注册对应Formatter;推荐用自定义StringToBigDecimalConverter、前端传标准数字字符串或@RequestBody配合@JsonFormat解决。

在 Spring Boot 中,@NumberFormat 不能直接用于 BigDecimal 类型的请求参数格式化(比如 @RequestParam 或 @ModelAttribute 字段),因为它底层依赖的是 Java 的 NumberFormat,而该类解析字符串时默认返回 Number(通常是 Double 或 Long),**不支持直接转成 BigDecimal**。
为什么 @NumberFormat 对 BigDecimal 失效?
@NumberFormat 是 Spring 提供的注解,主要用于将字符串按指定模式(如 pattern = "#,##0.00")或区域(style = Style.CURRENCY)解析为数字类型。但 Spring 内置的 NumberFormatAnnotationFormatterFactory 在处理时:
- 对
Double、Float、Long、Integer等基本包装类型有默认 Formatter; - 对
BigDecimal—— 没有注册对应的 Formatter,所以即使你写了@NumberFormat(pattern = "0.00") private BigDecimal price;,Spring 仍会使用默认的字符串转BigDecimal逻辑(即调用new BigDecimal("123.45")),@NumberFormat注解被忽略。
正确接收并格式化 BigDecimal 参数的 3 种方式
✅ 推荐方式 1:用 @RequestParam + 自定义 Converter(最灵活、推荐)
创建一个全局的 Converter,支持千分位、货币符号、任意小数位等解析:
"1234.56"
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











