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

Freemarker自定义函数内数字格式化触发NonMethodException问题咨询

Freemarker数字格式化报错原因及解决方案

你遇到的报错核心原因有两个:

  1. 语法和当前使用的Freemarker版本不匹配
    主流Freemarker 2.3.21及以上版本中,数字类型的?string内置函数传格式化参数的正确写法是用小括号包裹参数,即amount?string("########.00")。你代码中使用方括号[]传参属于2.3.20及更早旧版本的特殊语法,在新版本中会被解析为「先执行无参数的amount?string得到字符串结果,再尝试对这个字符串执行方法调用」,自然就会触发「期望得到方法/函数,实际得到字符串」的类型错误。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:27:03