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>

不要用简单真假判断隐藏金额,否则零也可能被当作“不显示”。核对格式时至少覆盖零、负数、整数位超过最小值、小数位不足及空值,确认业务允许的展示与计算规则一致。