You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Struts2到2.5.26后如何在JSP页面获取BigDecimal完整十进制值

解决方案

问题原因

该问题是Struts2 2.5.x版本对BigDecimal类型的默认转换逻辑调整导致的:

  • 旧版本Struts2会保留BigDecimal原始的小数位输出
  • 2.5.x版本的默认BigDecimal转换器会自动裁剪尾部无意义的0,同时textfield标签的内置数字格式化逻辑存在兼容问题,识别不到BigDecimal的小数位时就会出现undefined后缀

具体解决方法

方案1:标签局部配置(适合仅个别字段需要保留固定小数位的场景)

  1. 修复<s:property>标签输出问题:
    直接在标签上添加format属性指定小数格式,示例代码:
<s:property value="%{account.totAmt}" format="0.0000" />
  1. 修复<s:textfield>标签输出问题:
    通过getText方法手动格式化值后赋值给标签的value属性,示例代码:
<s:textfield id="price" name="account.totAmt" value="%{getText('{0,number,0.0000}', {account.totAmt})}" />

方案2:全局自定义转换器(适合所有BigDecimal字段都需要保留固定小数位的场景,一次配置解决两类问题)

  1. 编写自定义BigDecimal转换器类,继承Struts内置的BigDecimalConverter,重写字符串转换逻辑:
import java.math.BigDecimal;
import java.util.Map;
import com.opensymphony.xwork2.conversion.impl.BigDecimalConverter;

public class CustomBigDecimalConverter extends BigDecimalConverter {
    @Override
    public String convertToString(Map context, Object value) {
        if (value instanceof BigDecimal) {
            // 按需求保留4位小数,使用toPlainString避免科学计数法
            return ((BigDecimal) value).setScale(4, BigDecimal.ROUND_HALF_UP).toPlainString();
        }
        return super.convertToString(context, value);
    }
}
  1. 注册全局转换器:在项目的resources目录下新建xwork-conversion.properties文件,添加如下配置(替换为你自己的转换器类全路径):
java.math.BigDecimal=com.yourcompany.yourproject.converter.CustomBigDecimalConverter

配置完成后重启项目,所有BigDecimal类型字段的输出都会保留4位小数,两类标签的显示问题会同时解决。


内容的提问来源于stack exchange,提问作者Mickey Patel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 02:15:04