BullよりElk

洋服と食をこよなく愛するWebプログラマ。

ThymeleafでNumber.javaを継承したクラスをメッセージ式のパラメータとして渡すと千の位で区切ってくれる話

先日、仕事でThymeleafで千の位で区切って表示することをやりました。いわゆる金額表示です。
結論から述べると、以下のようにすると、実現できます。

ちなみにこれはたまたま発見できちゃいました。。。笑
最初は、次のように書いてました。

<p th:text="${#numbers.formatInteger(1234567890, 3, 'COMMA')} + '円'">1,234,567,890円</p>

ある記事を読んでいてメッセージ式にパラメータを渡せることを知りました。
そこでカンマ区切りのことは気にせず、上のように書いてみたら、金額表示になってました。
しかし、なぜ数値をパラメータとして渡すと千の位で区切ってくれる(区切って欲しくないときもあるけど)のか気になったのでソースコード追ってみました。
MessageSourceインターフェースのgetMessageメソッドにブレークポイントを張りました。
MessageFormat.java#subformatが気になりました。

案の定、16行目に止まり、ここでsubformatにDecimalFormat.javaを返していました。
そして、DecimalFormat.javaのsubformatメソッドに処理がうつり、ここで実際に1000の位に区切っていました。それが以下の箇所です。

実際にソースを読んでもらえればわかるのですが、groupingという変数に「,」が格納されています。
DecimalFormatSymbols (Java Platform SE 8 )
ループで回し、パラメタを1個ずつ渡して、1000の位で「,」を入れています。

ちなみに、NumberFormatProvider.javaにこのようなメソッドがあったのでこれをうまく呼ぶ方法を見つけたいなと思いました。

public abstract NumberFormat getCurrencyInstance(Locale locale);

以上です。