SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

Java入門 (10) - さまざまな値とフォーマット

作って覚えるJavaプログラミングのススメ 第10回


金額のフォーマット

 数値の中でも「金額」というのは非常によく使われるものの一つです。これも、専用のメソッドがNumberFormatに用意されています。getCurrencyInstanceというもので、インスタンスを取得する際、getInstanceの代りにこのメソッドを呼び出すと、金額の表示を簡単に得ることができます。

public static void main(String args[]) {
    int n = 1234567;
    NumberFormat format =
        NumberFormat.getCurrencyInstance(Locale.JAPAN);
    System.out.println(format.format(n));

}
1234567を、円の金額として表示する。
1234567を、円の金額として表示する。

 例えば、日本円による表示であれば、このようにすると「¥1,234,567」といったテキストが表示されます。getCurrencyInstanceで、引数にLocale.JAPANというものを渡していますね。これは、日本のロケール情報を示すLocaleです。ドルによる表示をしたければ、Locale.USとすれば、「$1,234,567.00」といった表示になります。

 金銭関係というのは、けっこう日本円以外のものも使うことがありますから、基本的な使い方ぐらいはしっかりと覚えておきたいものです。

テキストのフォーマット

 この「決まったパターンに従ってフォーマットする」という考え方は、日時や数字といった値だけでなく、もっと汎用的なテキストでも利用することができます。これには、java.textパッケージのMessageFormatというクラスを利用します。

 MessageFormatは、あらかじめ用意しておいたパターンの指定用テキストを元にメッセージを生成するためのものです。パターン指定のテキストには、「何番目のオブジェクトをどこにどう表示するか」といったことを指定しておきます。そして、パターンのテキストと共に、Object配列を渡すことで、そのObjectを使ってパターンを生成させます。

 これは、文字で説明しただけだとなかなかイメージしにくいでしょう。簡単なサンプルを挙げて説明しましょう。

import java.text.MessageFormat;

// ……(略)……

public static void main(String args[]) {
    Object[] obj = {new GregorianCalendar().getTime(),1234567};
    String pattern =
        "本日は、{0,date,full}。現在の金額は、{1,number,currency}です。";
    try {
        String msg = MessageFormat.format(pattern, obj);
        System.out.println(msg);
    } catch (IllegalArgumentException e) {
        System.out.println("メッセージの生成に失敗しました。");
    }
}
Dateとint値を組み合わせてメッセージを生成し表示する。
Dateとint値を組み合わせてメッセージを生成し表示する。

 ここでは、「日付」と「金額を示す整数」の2つの値を元に、メッセージを生成し、表示させています。ここでは、DateIntegerintをオブジェクトとして扱うときに用いられるクラス)を使ってメッセージを生成させるようにしてあります。まず、メッセージのパターンとなるものがどう作られているかを見てみましょう。

String pattern =
    "本日は、{0,date,full}。現在の金額は、{1,number,currency}です。";

 これが、パターンとなるテキストです。途中に、{}記号でくくった部分が2箇所ありますが、これが、Object配列を元にメッセージを生成している部分です。この{}では、渡されるObject配列から取り出すインデックス番号を指定します。配列の最初の要素をここに当てはめたければ、{0}とするわけです。

 ただ値をはめ込むだけでなく、数字や日付を決まった形でフォーマットしてはめ込みたい場合には、{インデックス番号,種類,スタイル}というように、その値がどういう値で、どんなスタイルで表現するのかを指定できます。この種類とスタイルには、次のようなものが用意されています。

値の種類
種類意味
number数値
date日付
time時刻
choice選択項目(ChoiceFormatというクラスで作れる)
各種類ごとのスタイル
種類スタイル
numberのスタイルinteger,currency,percent
date,timeのスタイルshort,medium,long,full

 これらを参考にしながら、先ほど作成されたメッセージの{}部分を見てみましょう。すると、次のような役割を果たしているものであることが分かります。

指定意味
{0,date,full}0番目のDateインスタンスを完全な形式でフォーマットする
{1,number,currency}1番目の数値を金額の形式でフォーマットする

 これで、生成されるメッセージがどういうものかは分かりましたね。では、MessageFormatに渡されるObject配列は、どのようになっていたでしょうか。

Object[] obj = {new GregorianCalendar().getTime(),1234567};

 こんな値が渡されていました。MessageFormat.format(pattern, obj)というようにして、パターンのStringObject配列を渡しformatするのです。これで生成されるメッセージは、こうなります。

本日は、2008年7月9日。現在の金額は、¥1,234,567です。

 Dateintの値が変われば、生成されるメッセージも変わります。このように、あらかじめ決まったテキストの文面に、必要に応じて値をはめ込んでメッセージを生成するような場合、このMessageFormatは非常に便利です。

次のページ
選択肢からテキストを選び出す

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2795 2008/07/30 09:30

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー