使用Thymeleaf在Spring中格式化货币

2023/05/19

1. 简介

在本教程中,我们将学习如何使用Thymeleaf按区域设置货币格式。

2. Maven依赖

让我们从导入Spring Boot Thymeleaf依赖项开始:

<dependency>
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-thymeleaf</artifactId> 
    <version>2.2.7.RELEASE</version>
</dependency>

3. 项目设置

我们的项目将是一个简单的Spring Web应用程序,它根据用户的区域设置显示货币。让我们在resources/templates/currencies中创建我们的Thymeleaf模板currencies.html:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Currency table</title>
</head>
</html>

我们还可以创建一个控制器类来处理我们的请求:

@Controller
public class CurrenciesController { 
    @GetMapping(value = "/currency")
    public String exchange(@RequestParam(value = "amount") String amount, Locale locale) {
        return "currencies/currencies";
    }
}

4. 格式化

当谈到货币时,我们需要根据请求者的语言环境来格式化它们。

在这种情况下,我们将在每个请求中发送Accept-Language标头以表示我们用户的语言环境。

4.1 货币

Thymeleaf提供的Numbers类支持格式化货币。那么,让我们通过调用formatCurrency方法来更新我们的视图

<p th:text="${#numbers.formatCurrency(param.amount)}"></p>

当我们运行我们的示例时,我们将看到正确格式化的货币:

@Test
public void whenCallCurrencyWithUSALocale_ThenReturnProperCurrency() throws Exception {
    mockMvc.perform(MockMvcRequestBuilders.get("/currency")
        .header("Accept-Language", "en-US")
        .param("amount", "10032.5"))
        .andExpect(status().isOk())
        .andExpect(content().string(containsString("$10,032.50")));
}

由于我们将Accept-Language标头设置为美国,因此货币格式为小数点和美元符号。

4.2 货币数组

我们也可以使用Numbers类来格式化数组。因此,我们将向我们的控制器添加另一个请求参数:

@GetMapping(value = "/currency")
public String exchange(@RequestParam(value = "amount") String amount, @RequestParam(value = "amountList") List amountList, Locale locale) {
    return "currencies/currencies";
}

接下来,我们可以更新视图以包含对listFormatCurrency方法的调用:

<p th:text="${#numbers.listFormatCurrency(param.amountList)}"></p>

现在让我们看看结果是什么样的:

@Test
public void whenCallCurrencyWithUkLocaleWithArrays_ThenReturnLocaleCurrencies() throws Exception {
    mockMvc.perform(MockMvcRequestBuilders.get("/currency")
        .header("Accept-Language", "en-GB")
        .param("amountList", "10", "20", "30"))
        .andExpect(status().isOk())
        .andExpect(content().string(containsString("£10.00, £20.00, £30.00")));
}

结果显示添加了正确的英国格式的货币列表。

4.3 尾随零

使用Strings#replace,我们可以删除尾随的零。

<p th:text="${#strings.replace(#numbers.formatCurrency(param.amount), '.00', '')}"></p>

现在我们可以看到没有尾随双零的全部金额:

@Test
public void whenCallCurrencyWithUSALocaleWithoutDecimal_ThenReturnCurrencyWithoutTrailingZeros() throws Exception {
    mockMvc.perform(MockMvcRequestBuilders.get("/currency")
        .header("Accept-Language", "en-US")
        .param("amount", "10032"))
        .andExpect(status().isOk())
        .andExpect(content().string(containsString("$10,032")));
}

4.4 小数点

根据区域设置,小数的格式可能不同。因此,如果我们想用逗号代替小数点,可以使用Numbers类提供的formatDecimal方法:

<p th:text="${#numbers.formatDecimal(param.amount, 1, 2, 'COMMA')}"></p>

让我们看看测试的结果:

@Test
public void whenCallCurrencyWithUSALocale_ThenReturnReplacedDecimalPoint() throws Exception {
    mockMvc.perform(MockMvcRequestBuilders.get("/currency")
        .header("Accept-Language", "en-US")
        .param("amount", "1.5"))
        .andExpect(status().isOk())
        .andExpect(content().string(containsString("1,5")));
}

该值将被格式化为“1,5”。

5. 总结

在这个简短的教程中,我们展示了如何将Thymeleaf与Spring Web一起使用,以使用用户的区域设置来处理货币。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章