2010-11-25 1 views
5

私のデータ構造をカスタムフォーマットにしたい。例: 私はDSを持っていますJavaのカスタム変換指定子

Address { 
    string house_number, 
    string street, 
    string city, 
    long pin_code, 
} 

ここで、これらの各フィールドに特定の変換指定子を関連付けたいとします。

e.g. house_number -> H 
    street -> S, 
    city -> C, 
    pin_code -> P 
    ... 

など(address_instance.city =ボストン場合)、 "Aさんは、ボストンに住んでいる"

myPrintWriter.printf("Mr A lives in %C", address_instance) 

利回り..

のようなものは、それを行うための簡単な方法がないと思われるようにするにはこの。 java.util.Formatterは最終的なようです。それが提供する唯一のカスタマイズはFormattableインターフェースを介して行われますが、それは 's'変換指定子のカスタマイズに役立ちます。 カスタム変換指定子を追加する方法はありますか?どんな助けでも大歓迎です。

おかげで、

答えて

0

私はあなたが望むように動作し、独自のフォーマッタを作成する必要があります信じています。

3

これは簡単な方法ではないようです。 java.util.Formatterは最終的なようです。

これは当てはまりますが、それでも構図を使用できます。

class ExtendedFormatter { 
    private Formatter defaultFormatter; 

    // provide the same methods like the normal Formatter and pipe them through 
    // ... 

    // then provide your custom method, or hijack one of the existing ones 
    // to extend it with the functionality you want 
    // ... 
    public Formatter format(String format, Object... args) { 
     // extract format specifiers from string 
     // loop through and get value from param array 

     ExtendedFormattable eft = (ExtendedFormattable)args1; 
     String specifierResult = eft.toFormat(formatSpecifier); // %C would return city 

     // use specifierResult for the just queried formatSpecifier in your result string 
    } 
} 

難しい部分は、あなたが出力したいフィールドに異なる書式指定子を接続する方法を知っている:私は、次のような何かをするだろう。私が考えることのできる最初の方法は、ExtendedFormatterで使用されるべき各クラスがカスタムフォーマット指定子の対応する値を実装し返すことができる、独自のExtendedFormattableインターフェイスを提供することです。それは可能性があります:

class Address implements ExtendedFormattable { 
    public String toFormat(String formatSpecifier) { // just an very simple signature example 
     // your custom return values here ... 
    } 
} 

また、注釈もありますが、それは非常に実行可能な方法ではないと思います。 ExtendedFormatter内はかなり困難であると考えられるからExtendedFormattableを使用して

ExtendedFormatter ef = new ExtendedFormatter(); 
ef.format("Mr A lives in %C", address_instance); 
+0

サンプル呼び出しは次のようになります。あなたは何かを念頭に置いていましたか? – baskin

+0

@baskin:いくつかのコードとコメントを追加しました。 – MicSim

関連する問題