Ste*_*ins 8 java spring spring-mvc thymeleaf
使用该th:text属性评估和呈现数字字段时,Thymeleaf会显示可用的完整位数.例如,这个:
<span th:text="${user.averageScore}"/>
Run Code Online (Sandbox Code Playgroud)
...可能会在浏览器屏幕上呈现:
107.54896
Run Code Online (Sandbox Code Playgroud)
我想将这个金额四舍五入到不超过两位小数.从Thymeleaf文档中可以看出:
<span th:text="${#numbers.formatDecimal(user.averageScore, 0, 2)}"/>
Run Code Online (Sandbox Code Playgroud)
...将输出更改为:
107.55
Run Code Online (Sandbox Code Playgroud)
但是,有没有办法使这个更灵活......如果值的FEWER小于两位小数?我只想删除小数位,以减少两个.我从不想添加小数位,最多可以达到两位.如果上面的字段的值为107,那么它将呈现为:
107.00
Run Code Online (Sandbox Code Playgroud)
如何将Thymeleaf格式数字制作为小数点后两位或更少...而不是仅仅两位小数,无论如何?
嗨,您可以尝试这样的事情。
<span th:text="${user.averageScore} % 1 == 0? ${user.averageScore} :${#numbers.formatDecimal(user.averageScore, 0, 2)}"/>
Run Code Online (Sandbox Code Playgroud)
在Thymeleaf 2.1中没有简单的方法可以执行此操作,但是有两种困难的方法。
困难方法#1:分叉Thymeleaf,并在类org.thymeleaf.expression.Numbers中添加一个格式化方法,该数字方法可以实现您想要的(添加采用DecimalFormat模式的方法似乎是一个逻辑扩展)
困难方法2:向Thymeleaf添加方言,以提供一种新的表达式类,可以执行所需的格式设置。下面的示例基于将Spring与Thymeleaf结合使用来注册方言,以格式化表示小时的数字。
步骤1:注册方言:
@Component
public class ThymeLeafSetup implements InitializingBean {
@Autowired
private SpringTemplateEngine templateEngine;
@Override
public void afterPropertiesSet() throws Exception {
templateEngine.addDialect(new HoursDialect());
}
}
Run Code Online (Sandbox Code Playgroud)
步骤#2:基于Java8TimeDialect创建方言类(委托给TimeUtils静态方法的格式化逻辑):
public class HoursDialect extends AbstractDialect implements IExpressionEnhancingDialect {
public static class Hours {
public String format(BigDecimal hours) {
return TimeUtils.formatHours(hours);
}
}
@Override
public String getPrefix() {
// No attribute or tag processors, so we don't need a prefix at all and
// we can return whichever value.
return "hours";
}
@Override
public boolean isLenient() {
return false;
}
@Override
public Map<String, Object> getAdditionalExpressionObjects(IProcessingContext processingContext) {
return Collections.singletonMap("hours", new Hours());
}
}
Run Code Online (Sandbox Code Playgroud)
步骤#3:基于DecimalFormat创建格式化逻辑
public class TimeUtils {
public static String formatHours(BigDecimal hours) {
DecimalFormat format = new DecimalFormat("#0.##");
format.setGroupingUsed(true);
format.setGroupingSize(3);
return format.format(hours);
}
}
Run Code Online (Sandbox Code Playgroud)
步骤4:测试格式化逻辑
@Test
public void formatDecimalWilLFormatAsExpected() {
verifyHourNumberFormatsAsExpected("1.5", "1.5");
verifyHourNumberFormatsAsExpected("1.25", "1.25");
verifyHourNumberFormatsAsExpected("123.0", "123");
verifyHourNumberFormatsAsExpected("1230", "1,230");
}
void verifyHourNumberFormatsAsExpected(String number, String expected) {
assertThat(TimeUtils.formatHours(new BigDecimal(number))).isEqualTo(expected);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8876 次 |
| 最近记录: |