java - 如何覆盖 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,但仍然有办法在整个应用程序中覆盖标准库方法吗?
解决方案
BigDecimal
您可以扩展类并覆盖toString
您自己的类中的方法,而不是直接使用。然后,您只需替换构造函数调用即可使用您的类。
public class MyBigDecimal extends BigDecimal {
public MyBigDecimal(String val) {
super(val);
}
@Override
public String toString() {
return toPlainString();
}
}
推荐阅读
- python - ModuleNotFoundError: No module named 'pyodbc' 虽然包成功安装
- c++ - JSON 请求在名称验证检查期间忽略“\”
- tensorflow - 保存 Keras 模型错误:AttributeError: 'numpy.dtype' object has no attribute 'item'
- java - 使用 javax.xml.transform.Transformer
- java - 哪种方法可以防止谷歌地图重新创建?
- java - 如何从数据库中忽略或删除第一行(Cucumber/java)
- c# - BinaryFormatter 在类更改后反序列化委托字段
- java - Head First Java-Page 192(混合消息)
- python - 根据日期键的值过滤字典
- mqtt - 需要什么椭圆特定曲线?