Thymeleaf 的 #numbers.formatDecimal 用于展示数字。其中整数位参数表示最少显示多少位,不是最大长度,也不是把数字截短。小数位和分隔符则控制显示形式,不能代替业务金额计算。
先看参数次序
常用形式可以理解为:
formatDecimal(数字, 最少整数位, 小数位)
formatDecimal(数字, 最少整数位, 千位分隔符, 小数位, 小数分隔符)
例如使用 model 中的 amount:
<span th:text="${#numbers.formatDecimal(amount, 1, 2)}">金额</span>
<span th:text="${#numbers.formatDecimal(amount, 1, 'COMMA', 2, 'POINT')}">金额</span>
第二行明确用逗号分隔千位、用点分隔小数。若不明确指定分隔符,展示结果还会受对应格式化方法采用的 Locale 影响。Thymeleaf 数字工具说明
“7 位整数”会补零,不会截掉高位
以 1234.55 为说明:
| 格式意图 | 参数要点 | 应如何理解 |
|---|---|---|
| 至少 1 位整数,2 位小数 | 1、2 | 已有四位整数,无需补到其他长度 |
| 至少 7 位整数,2 位小数 | 7、2 | 整数部分补成 0001234 |
| 显式千位分隔 | COMMA | 使用逗号组织整数部分 |
| 显式小数分隔 | POINT | 小数点使用点 |
小数位不足会补齐;多余位数涉及格式化时的舍入,而不是直接字符串删除。业务必须控制舍入方式时,应在进入模板前完成计算,不能把展示格式当作结算规则。
整数格式化使用另一个方法
只展示整数并使用千位分隔,可以使用:
<span th:text="${#numbers.formatInteger(count, 1, 'COMMA')}">数量</span>
它适合展示,不会把数据库字段类型改成整数。金额通常仍应在后台用合适的十进制类型计算。
空值和零也要区分
若 amount 允许为 null,可明确空值文案:
<span th:text="${amount == null ? '—' : #numbers.formatDecimal(amount, 1, 'COMMA', 2, 'POINT')}">金额</span>
不要用简单真假判断隐藏金额,否则零也可能被当作“不显示”。核对格式时至少覆盖零、负数、整数位超过最小值、小数位不足及空值,确认业务允许的展示与计算规则一致。