在 freemarker 模板中,`double` 类型本身不保存小数位信息,需通过格式化指令(如 `?string('0.00')`)显式指定两位小数输出,确保 `100.0` 或 `100.00` 均渲染为 `100.00`。
当使用 OpenHTMLToPDF 渲染 PDF 时,常遇到数值字段显示不一致的问题:字符串 "1200.00" 能原样输出,但 Double 类型的 100.00 却被默认格式化为 100——这是因为 FreeMarker 对数字的默认输出会省略无意义的小数位(如 100.00 → 100),而该行为由底层 NumberFormat 决定,与原始值是否含 .00 无关。
✅ 正确做法是使用内建的字符串格式化指令 ?string(pattern),配合 Java DecimalFormat 兼容的模式:
${price?string('0.00')}
${amount?string('#,##0.00')} ⚠️ 注意事项:
configuration.setNumberFormat("0.00"); // Java 端设置或在模板中定义宏复用:
<#macro fmt00 num><#-- 两位小数格式化 -->${num?string('0.00')}#macro> <@fmt00 price />
? 总结:FreeMarker 中数字的“外观”完全取决于格式化策略,而非原始类型。对 PDF 打印等要求精确格式的场景,务必显式调用 ?string('0.00'),这是最直接、可靠且无需修改业务逻辑的解决方案。