Top Page/ Java Tips[Applet]/ Java Tips[Application]


3.MessageFormat クラスの使用[文字列処理/Java 1.1][2000/05/01]

 今回は、趣向を変えて、文字列処理です。
 Java には、C言語でおなじみの、sprintf,sscanf がありませんが、 一応似たようなのがあります(似てないかもしれませんが・・・)ので、今回紹介することにします。

[Java 1.1]
/*
    MessageFormatDemo.java
*/
import java.text.MessageFormat;

public class MessageFormatDemo{
    public static void main(String args[]){
        demo1();
    }
    public static void demo1(){
        int a = 100,b = 65535;
        double d = 12.5663706;
        
        Object[] argument = {
            new Integer(a),
            new Integer(b),
            new Double(d)
        };
        String format = "a={0}, b={1}, d={2}";
        String result = MessageFormat.format(format,argument);
        System.out.println("Demo 1:");
        System.out.println("Format = \"" + format + "\"");
        System.out.println(result);
        System.out.println();
        
        format = "a={0} , b={1,number,#} , d={2,number,#.####################}";
        result = MessageFormat.format(format,argument);
        System.out.println("Format = \"" + format + "\"");
        System.out.println(result);
        System.out.println();
    }
}
[実行結果]
D:\JAVA\japplication>javac MessageFormatDemo.java

D:\JAVA\japplication>java MessageFormatDemo
Format = "a={0}, b={1}, d={2}"
a=100, b=65,535, d=12.566

Format = "a={0} , b={1,number,#} , d={2,number,#.####################}"
a=100 , b=65535 , d=12.5663706

それでは、見ていきましょう。
        Object[] argument = {
            new Integer(a),
            new Integer(b),
            new Double(d)
        };
        String format = "a={0}, b={1}, d={2}";
        String result = MessageFormat.format(format,argument);
 C言語の sprinf に対応する部分が、MessageFormat.format(format,argument) です。
Java では、可変個の引数が使えないので、Object[] argument = { ・・・ }Object型の配列を作ってやります。
この部分は、
        Object[] argument = new Object[3];
        argument[0] = new Integer(a);
        argument[1] = new Integer(b);
        argument[2] = new Double(d);
と書いても同じです。
 Object 型の変数には、クラスであればどのようなものでも代入することができます。
しかし、int や、double などの基本データ型は、クラスではないのでObject 型の変数に代入できません。
そのため、IntegerDouble などを作ります。これらをラッパークラスといいます。
 Java における基本データ型と、ラッパークラスの対応は次のとおりです。 ただし、表中のC言語は、32bit 処理系(int が 32bit 整数)のものとします。
基本データ型ラッパークラスデータ対応するC/C++の型
byteByte符号付き 8bit整数(-128 〜 127)char
charCharacter符号なし 16bit整数(0 〜 65535)unsigned short
shortShort符号付き 16bit整数(-32768 〜 32767)short
intInteger符号付き 32bit整数(-2147483648 〜 2147483647)int
longLong符号付 64bit 整数(-9223372037854775808 〜 9223372037854775807)---
floatFloat32bit (単精度)浮動小数float
doubleDouble64bit (倍精度)浮動小数double
booleanBooleantrue または falsebool (C++)
 さて、一番肝心なのは、format の中身です。ここでは、次のようになってます。
        String format = "a={0}, b={1}, d={2}";
        String result = MessageFormat.format(format,argument);
format の中の、{0},{1},{2} などは、それぞれ、MessageFormat.format(format,argument) の、
argument[0],argument[1],argument[2] に対応します。
 そして、result には、"a=100, b=65,535, d=12.566"が入ります。
 ただ、デフォルトでは、整数に三桁ごとに,が入ってしまいますし、小数点以下は三桁までしか表示されません。
これは、次のようにすれば回避できます。
        format = "a={0} , b={1,number,#} , d={2,number,#.####################}";
{1} が、{1,number,#} となったのに注意してください。これで、三桁ごとに, が入らなくなります。
また、{2,number,#.#######} などのようにすることで、小数点以下表示したい桁数を調整できます。
まあ、,が入るのを防ぎたいだけなら、単純に
         result = "a=" + a + " , b=" + b + " , d=" + d;
でもいいんですけどね(^_^;
次は、sscanf ですね。

[Java 1.1]
/*
    ParseDemo.java
*/

import java.text.MessageFormat;
import java.text.ParseException;

public class ParseDemo{
    public static void main(String args[]){
        try{
            MessageFormat mf = new MessageFormat("a = {0} , b = {1} , c = {2}");
            Object[] result = mf.parse("a = 100 , b = 3.14159 , c = あいうえお");
        
            int    a = Integer.parseInt((String)result[0]);
            double b = Double.parseDouble((String)result[1]);
            String c = (String)result[2];
            
            System.out.println("a = " + a);
            System.out.println("b = " + b);
            System.out.println("c = " + c);
        }catch(ParseException e){
            System.out.println(e.toString());
        }
    }
}
[実行結果]
D:\JAVA\japplication>java ParseDemo
a = 100
b = 3.14159
c = あいうえお

D:\JAVA\japplication>

try{ ・・・ } の中身が、大事な部分です。
            MessageFormat mf = new MessageFormat("a = {0} , b = {1} , c = {2}");
            Object[] result = mf.parse("a = 100 , b = 3.14159 , c = あいうえお");
この部分では、format "a = {0} , b = {1} , c = {2}" にしたがって、"a = 100 , b = 3.14159 , c = あいうえお"を解析し、 結果をObject 型の配列result に入れています。
この例では、result[0]100result[1]3.14159 が、result[2]あいうえお が入ります。

 また、result の各要素は、String にキャストすることができます。
Stringintdouble にするには、次のようにします。
            int    a = Integer.parseInt((String)result[0]);
            double b = Double.parseDouble((String)result[1]);
これで、文字列の解析ができましたね。もし、解析が失敗した場合は、ParseExceptionthrow されますので、
        }catch(ParseException e){
            System.out.println(e.toString());
        }
のところで、しかるべき処理をしましょう。