データベースなどから取得した数値データを出力する際に、人間が見やすい形に加工することは重要です。けた区切りのカンマを付加したい、小数点以下のけた数をそろえたい、負数の場合には先頭に「▲」を付けたいなど、データを利用するコンテキスト次第でニーズはさまざまであるはずです。
これらは、とかく軽視されがちなポイントかもしれませんが、アプリケーションの最終的な成果物であるデータがどれだけ見やすく、誤解のないように見えるかは、極端な話、エンドユーザーにとってはそのアプリケーションを評価する「すべて」でもあるのです。
ただ、ささいなこととはいえ、数値データの加工は決して単純な操作ではありません。冒頭で述べたように、数値の表記にはさまざまなパターンがありますし、また、国/地域によっても表記が異なるケースがあります(例えば、通貨記号など)。Java基本APIには、こうした数値の整形を簡単に行うためのjava.text.DecimalFormatクラスが用意されていますが、数値を整形するだけのために、いちいちJSPページにスクリプトレットを記述しなければならないのは、あまり好ましいことではありません(可読性や保守性を考慮した場合、JSPページではできるだけスクリプティング要素を利用するべきではありません)。
しかし、JSTL(JSP Standard TagLibrary)のi18nタグライブラリを利用することで、このような定型的な数値加工のロジックをスクリプトレスで指定することができます。以下に、i18nタグライブラリを使った簡単な例を見てみましょう。
<%@ page contentType="text/html;charset=Windows-31J" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <fmt:formatNumber value="17005" type="CURRENCY" groupingUsed="true" />
<fmt:formatNumber>要素は、value属性で指定された値を、その他の属性で指定された様式に従って加工し、結果を出力します(注)。上の例の場合、type属性がCURRENCY(通貨)なので通貨記号を数値の先頭に、groupingUsed属性がtrueなので1000の単位にけた区切り記号を、それぞれ付与します。つまり、上の用例は結果として以下のような出力を生成します。
¥17,005
そのほかにも、<fmt:formatNumber>要素にはさまざまな属性が用意されています。以下に主要な属性をまとめておくことにしましょう。
属性 | 概要 | |
---|---|---|
type | データ型(NUMBER|CURRENCY|PERCENT) | |
currencyCode | 通貨コード(JPY|USDなど) | |
currencySymbol | 通貨記号(\、$など) | |
groupingUsed | けた区切り記号を使用するか(true|false) | |
maxIntegerDigits | 整数部分の最大けた数 | |
minIntegerDigits | 整数部分の最小けた数 | |
maxFractionDigits | 小数部分の最大けた数 | |
minFractionDigits | 小数部分の最小けた数 | |
max/minIntegerDigitsやmax/minFractionDigits属性を指定した場合には、数値の出力けたをそろえることができます。max〜属性の指定値を出力けたが超えた場合には自動的に切り捨てが行われますし、min〜属性の指定値に出力けたが満たない場合には、0が補完されます。
<fmt:formatNumber value="234.5678" groupingUsed="true" maxIntegerDigits="4" maxFractionDigits="2" minIntegerDigits="4" minFractionDigits="2" />
すなわち、上記の例では、以下のような結果になります。
0,234.57
currencyCode、currencySymbol属性は、type属性がCURRENCY(通貨)の場合にのみ有効です。通常、通貨記号は現在のロケール(地域)情報に従って決まりますが(注)、個々の出力単位に指定したいという場合には、これらの属性で設定する必要があります。
<fmt:formatNumber value="170" type="CURRENCY" currencySymbol="£" />
すなわち、上記の例では、以下のような結果になります
£170
以上のような属性を利用することでたいがいの表記は実現できますが、時として、より複雑な書式を指定したいというケースがあるかもしれません。そのような場合には、pattern属性でカスタムの書式文字列を指定することも可能です。例えば、以下は、与えられた数値が正数であるか負数であるかによって、異なる書式を指定します。
<fmt:formatNumber value="234.3" pattern="△#,##0.00;▼#,##0.00" /><br /> <fmt:formatNumber value="-1234.56" pattern="△#,##0.00;▼#,##0.00" />
上記の例は、以下のような結果になります。
△234.30 ▼1,234.56
これらは、ほんの一例ですが、pattern属性では以下のような書式記述子を組み合わせることで、さまざまなパターンを表現することができます。最後に、pattern属性で利用可能なパターン記述子を挙げておくことにしましょう。
書式記述子 | 概要 | |
---|---|---|
0 | 数値(ゼロでも表示) | |
# | 数値(ゼロは表示しない) | |
- | マイナス記号 | |
, | グループ区切り | |
; | 正負サブパターンの区切り | |
% | パーセント(1/100) | |
\u2030 | パーミル(1/1000) | |
E | 科学表記法 | |
Copyright © ITmedia, Inc. All Rights Reserved.