Freemarker自定义函数内数字格式化触发NonMethodException问题咨询
Freemarker数字格式化报错原因及解决方案
你遇到的报错核心原因有两个:
- 语法和当前使用的Freemarker版本不匹配
主流Freemarker 2.3.21及以上版本中,数字类型的?string内置函数传格式化参数的正确写法是用小括号包裹参数,即amount?string("########.00")。你代码中使用方括号[]传参属于2.3.20及更早旧版本的特殊语法,在新版本中会被解析为「先执行无参数的amount?string得到字符串结果,再尝试对这个字符串执行方法调用」,自然就会触发「期望得到方法/函数,实际得到字符串」的类型错误。 amount参数类型不符合要求
如果传入的amount本身就是字符串类型,而非数字类型,那么无参数调用amount?string会直接返回原字符串,此时不管用方括号还是圆括号传格式化参数,都会因为字符串不是可调用的方法/函数报错。
至于#local str = amount?string可以正常运行的原因很简单:数字、字符串等Freemarker支持的常规类型,都可以无参数调用?string内置函数,会按照默认规则输出为字符串,不需要额外传参,所以不会触发报错。
修复方案
- 先校验入参
amount的实际类型,如果是字符串格式的数字,先转成数字类型再做格式化,示例写法:#local str = amount?number?string("########.00") - 2.3.21及以上版本统一用小括号传递格式化参数即可。如果必须兼容极旧版本的Freemarker,确认
amount是数字类型后可以使用方括号传参的写法,但更建议升级到稳定的新版本规避各类兼容性问题。
内容的提问来源于stack exchange,提问作者Dmitrii Vashchenko
相关产品推荐
相关产品推荐

