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 웹 애플리케이션이 될 것 입니다. 이제 만들어 보자 우리 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에서 제공하는 클래스는, 통화 포맷을 지원한다. 이제 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")));
}

결과에는 적절한 영국 형식이 추가 된 통화 List이 표시됩니다.

4.3. 후행 0

Strings # replace를 사용  하여 후행 0을 제거 할 수 있습니다  .

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

이제 우리는 후행 이중 0없이 전체 금액을 볼 수 있습니다.

@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에서 사용할 수 있습니다 .