1. 序章

このチュートリアルでは、Thymeleafを使用してロケールごとに通貨をフォーマットする方法を学習します。

2. Mavenの依存関係

Spring BootThymeleaf依存関係をインポートすることから始めましょう。

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

3. プロジェクトの設定

私たちのプロジェクトは、がユーザーのロケールに基づいて通貨を表示する単純なSpringWebアプリケーションになります。 X214X]:

<!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から入手できます。