連載
» 2005年02月15日 10時00分 公開

JavaTips 〜JSP/サーブレット編:JSTLを使って数値データを加工する

[山田祥寛,@IT]

 データベースなどから取得した数値データを出力する際に、人間が見やすい形に加工することは重要です。けた区切りのカンマを付加したい、小数点以下のけた数をそろえたい、負数の場合には先頭に「▲」を付けたいなど、データを利用するコンテキスト次第でニーズはさまざまであるはずです。

 これらは、とかく軽視されがちなポイントかもしれませんが、アプリケーションの最終的な成果物であるデータがどれだけ見やすく、誤解のないように見えるかは、極端な話、エンドユーザーにとってはそのアプリケーションを評価する「すべて」でもあるのです。

 ただ、ささいなこととはいえ、数値データの加工は決して単純な操作ではありません。冒頭で述べたように、数値の表記にはさまざまなパターンがありますし、また、国/地域によっても表記が異なるケースがあります(例えば、通貨記号など)。Java基本APIには、こうした数値の整形を簡単に行うためのjava.text.DecimalFormatクラスが用意されていますが、数値を整形するだけのために、いちいちJSPページにスクリプトレットを記述しなければならないのは、あまり好ましいことではありません(可読性や保守性を考慮した場合、JSPページではできるだけスクリプティング要素を利用するべきではありません)。

 しかし、JSTL(JSP Standard TagLibrary)のi18nタグライブラリを利用することで、このような定型的な数値加工のロジックをスクリプトレスで指定することができます。以下に、i18nタグライブラリを使った簡単な例を見てみましょう。

formatNumber.jsp
<%@ 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
注:加工の対象となる値は、value属性の代わりに、<fmt:formatNumber>要素配下のテキスト(本体)として指定することも可能です。固定値、または式言語(Expression Language)で表現できる値はvalue属性で、ほかのタグライブラリによる出力結果を利用したい場合には、配下のテキストとして指定するのが通例です。なお、加工結果はそのまま出力するのではなく、var属性を指定することで指定された変数に格納することも可能です(scope属性でスコープの指定も可能)。

 そのほかにも、<fmt:formatNumber>要素にはさまざまな属性が用意されています。以下に主要な属性をまとめておくことにしましょう。

<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
注:ロケール情報は、デフォルトでサーバ・デフォルトの地域設定に従いますが、アプリケーション単位、ページ単位で、それぞれ指定することもできます。ロケール設定の詳細については、「多国語対応のサイトを構築する(JSTL編)」を参照。

 以上のような属性を利用することでたいがいの表記は実現できますが、時として、より複雑な書式を指定したいというケースがあるかもしれません。そのような場合には、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属性で利用可能なパターン記述子を挙げておくことにしましょう。

pattern属性で利用可能な書式記述子
書式記述子 概要
0 数値(ゼロでも表示)
# 数値(ゼロは表示しない)
- マイナス記号
, グループ区切り
; 正負サブパターンの区切り
% パーセント(1/100)
\u2030 パーミル(1/1000)
E 科学表記法

Copyright© 2018 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。