Skip to content

4.9 算术运算

Thymeleaf 标准表达式支持常见的算术运算:加法(+)、减法(-)、乘法(*)、除法(/)和取模(%)。

html
<!-- 方式1:运算写在 ${} 外部(由 Thymeleaf 表达式引擎处理) -->
<div th:with="isEven=(${prodStat.count} % 2 == 0)">
  偶数行特殊样式
</div>

请注意,这些运算符也可以直接用在 OGNL 变量表达式内部(在这种情况下,它们将由 OGNL 执行,而不是由 Thymeleaf 的标准表达式引擎执行)。

html
<!-- 方式2:运算写在 ${} 内部(由 OGNL/SpringEL 引擎处理) -->
<div th:with="isEven=${prodStat.count % 2 == 0}">
  偶数行特殊样式
</div>

上述两种写法效果完全一致,都是判断 prodStat.count 是否为偶数,并将结果赋值给变量 isEven

核心规则与补充说明

  1. 运算执行主体的差异

    • 方式1((${prodStat.count} % 2 == 0)):Thymeleaf 先解析 ${prodStat.count} 得到数值,再由自身的表达式引擎执行 % 2 == 0 运算;
    • 方式2(${prodStat.count % 2 == 0}):整个 prodStat.count % 2 == 0 作为 OGNL/SpringEL 表达式,由表达式引擎直接计算,Thymeleaf 仅接收最终布尔结果。

    日常开发中两种写法无本质区别,方式2更简洁,是主流选择。

  2. 运算符的文本别名: 为了兼容 XML 规范(XML 中 /% 等符号可能有特殊含义),Thymeleaf 为部分运算符提供了文本别名:

    运算符别名示例(等价写法)
    /div${num / 2}${num div 2}
    %mod${num % 2}${num mod 2}

    示例:

    html
    <!-- 取模运算的别名写法,判断是否为偶数 -->
    <div th:with="isEven=${prodStat.count mod 2 == 0}">...</div>
    <!-- 除法运算的别名写法,计算半值 -->
    <div th:with="halfValue=${price div 2}">...</div>
  3. 算术运算的常见场景

    • 数值计算:${quantity * price}(计算总价)、${age + 1}(年龄+1);
    • 循环/列表处理:${index % 2 == 0}(奇偶行样式区分)、${totalItems / pageSize}(计算总页数);
    • 变量赋值:通过 th:with 定义计算后的临时变量(如上例的 isEven)。

关键注意事项

  • 运算时需确保参与运算的变量是数值类型:若变量为字符串(如 "10"),运算会按字符串规则执行(如 "10" + 2 = "102"),需提前转换或用 #numbers 工具对象处理;
  • 除法运算(//div)在 OGNL/SpringEL 中是“真除法”(如 5 / 2 = 2.5),若需整数除法需手动处理(如 ${(int)(5 / 2)});
  • 避免除以 0:需先判断除数非 0,防止异常(如 ${denominator != 0 ? (num / denominator) : 0})。

总结

  1. Thymeleaf 支持 +/-/*///% 算术运算,可写在 ${} 内部(OGNL/SpringEL 处理)或外部(Thymeleaf 处理),效果等价;
  2. /% 分别有文本别名 divmod,用于兼容 XML 规范,推荐在 XML 模板中使用别名;
  3. 运算前需确保变量为数值类型,避免字符串拼接错误,同时注意除数非 0 等边界情况。