
在 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')} ⚠️ 注意事项:
- ?string('0.00') 强制补零:100 → 100.00,0 → 0.00,123.4 → 123.40;
- 避免使用 ?c(计算机格式)或默认输出,它们不保证小数位数;
- 若项目中大量使用统一格式,可全局配置默认数字格式:
configuration.setNumberFormat("0.00"); // Java 端设置或在模板中定义宏复用:
<#macro fmt00 num><#-- 两位小数格式化 -->${num?string('0.00')}#macro> <@fmt00 price />
? 总结:FreeMarker 中数字的“外观”完全取决于格式化策略,而非原始类型。对 PDF 打印等要求精确格式的场景,务必显式调用 ?string('0.00'),这是最直接、可靠且无需修改业务逻辑的解决方案。










