本站在允许 JavaScript 运行的环境下浏览效果更佳


Thymeleaf 随机数生成与格式化详解

本文提出的示例均在 Thymeleaf 3.1 上经过测试。
可适用于多种使用 Thymeleaf 的场景,如 Halo CMS 主题获取随机数。

This article is also available in: English
此文章有英文版本

整数

生成范围在 [min, min+range) 中的随机整数

${#numbers.formatDecimal(T(java.lang.Math).floor(T(java.lang.Math).random()*range+min),0,0)}

生成范围在 [min, max] 中的随机整数

${#numbers.formatDecimal(T(java.lang.Math).floor(T(java.lang.Math).random()*(max-min+1)+min),0,0)}
点我查看示例

一个 p 标签,文本内容为一个范围在 [1, 6)[1, 5]) 的整数,可能的结果有:1, 2, 3, 4, 5

方法一

<p
  th:with="range=5,min=1"
  th:text="${#numbers.formatDecimal(T(java.lang.Math).floor(T(java.lang.Math).random()*range+min),0,0)}"
></p>

方法二

<p
  th:with="max=5,min=1"
  th:text="${#numbers.formatDecimal(T(java.lang.Math).floor(T(java.lang.Math).random()*(max-min+1)+min),0,0)}"
></p>

用作列表索引值

用作列表索引值其实不需要 #numbers.formatDecimal。如下示例,将两处 my_list 修改为实际列表,就可以随机显示一个列表中的值。

点我查看示例
<p
  th:with="randomIndex=${T(java.lang.Math).floor(T(java.lang.Math).random()*#lists.size(my_list))}"
  th:text="${my_list[randomIndex]}"
></p>

控制结果形式

生成范围在 [min, min+range) 中的随机整数。结果形式为:整数部分位数大于等于 integerDigits(不足的位数用前导 0 补足),小数部分位数等于 decimalDigits (用 0 补足不够的位数)

${#numbers.formatDecimal(T(java.lang.Math).floor(T(java.lang.Math).random()*range+min),integerDigits,decimalDigits)}

生成范围在 [min, max] 中的随机整数。结果形式为:整数部分位数大于等于 integerDigits(不足的位数用前导 0 补足),小数部分位数等于 decimalDigits (用 0 补足不够的位数)

${#numbers.formatDecimal(T(java.lang.Math).floor(T(java.lang.Math).random()*(max-min+1)+min),integerDigits,decimalDigits)}
点我查看示例

一个 p 标签,文本内容为一个范围在 [0, 5)[0, 4]) 的整数,可能的结果有:000.00, 001.00, 002.00, 003.00, 004.00

方法一

<p 
  th:with="range=5,min=0,integerDigits=3,decimalDigits=2"
  th:text="${#numbers.formatDecimal(T(java.lang.Math).floor(T(java.lang.Math).random()*range+min),integerDigits,decimalDigits)}"
></p>

方法二

<p 
  th:with="max=4,min=0,integerDigits=3,decimalDigits=2"
  th:text="${#numbers.formatDecimal(T(java.lang.Math).floor(T(java.lang.Math).random()*(max-min+1)+min),integerDigits,decimalDigits)}"
></p>

小数/浮点数

生成范围在 [min, max) 中的随机浮点数

${T(java.lang.Math).random()*(max-min)+min}
点我查看示例

一个 p 标签,文本内容为一个范围在 [0.5, 1.8) 的浮点数,可能的结果有:1.46833041859471749, 0.5578399752996518908, 1.15072203796468388

<p
  th:with="max=1.8,min=0.5"
  th:text="${T(java.lang.Math).random()*(max-min)+min}"
></p>

控制结果形式

生成范围在 [min, max) 中的随机浮点数。结果形式为:整数部分位数大于等于 integerDigits(不足的位数用前导 0 补足),小数部分位数等于 decimalDigits (用 0 补足不够的位数)

${#numbers.formatDecimal(T(java.lang.Math).random()*(max-min)+min,integerDigits,decimalDigits)}
点我查看示例

一个 p 标签,文本内容为一个范围在 [0.5, 150.8) 的浮点数,可能的结果有:00.83, 70.22, 150.23

<p
  th:with="max=150.8,min=0.5,integerDigits=2,decimalDigits=2"
  th:text="${#numbers.formatDecimal(T(java.lang.Math).random()*(max-min)+min,integerDigits,decimalDigits)}"
></p>

原项目相关进展

截至此文发布时(2025.2.19),Thymeleaf 关于随机数的 Issue 依旧无新动态,保持开放状态:
Random integer in #numbers · Issue #787 · thymeleaf/thymeleaf


0