首页 > 解决方案 > 如何覆盖 BigDecimal toString() 方法?

问题描述

我正在开发一个使用 JSP 构建的旧版 Web 应用程序。我被要求在代码中用 BigDecimal 替换 double 。我知道 BigDecimal 的默认 toString() 方法使用科学记数法来呈现数字。在 JSP 页面上输出数字时会出现问题。我不想用 < fmt:formatNumber type="number" ... /> 替换每个 ${obj.property}。所以我想知道是否有办法覆盖 toString() 方法,所以它会调用toPlainString()代替?我尝试了 cglib,但意识到它不是为了这个目的,因为它只能操纵 Enhancer 生成的 BigDecimal,如下所示:

Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(BigDecimal.class);
    enhancer.setCallback(new MethodInterceptor() {
        @Override
        public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
            if(method.getName().equals("toString")){
                return ((BigDecimal) obj).toPlainString();
            }else{
                System.out.println(method.getName() + " called.");
                return proxy.invokeSuper(obj, args);
            }
        }
    });
    BigDecimal bd = (BigDecimal) enhancer.create(new Class[]{String.class}, new Object[]{"123"});
    System.out.println(bd.toString());

我将看看 Byte Buddy 和 Javassit,但猜想它们的工作方式与 cglib 类似。

任何人都知道实现这一目标的方法吗?

对于 JSP,我可能会使用自定义的 javax.el.BeanELResolver,但仍然有办法在整个应用程序中覆盖标准库方法吗?

标签: javajspbigdecimalcglib

解决方案


BigDecimal您可以扩展类并覆盖toString您自己的类中的方法,而不是直接使用。然后,您只需替换构造函数调用即可使用您的类。

public class MyBigDecimal extends BigDecimal {
    public MyBigDecimal(String val) {
        super(val);
    }

    @Override
    public String toString() {
        return toPlainString();
    }
}

推荐阅读