0

標準のフォーマッタに似たスマートなJava文字列フォーマッタを探しています。

    StringBuffer buffer = new StringBuffer();
    Formatter formatter = new Formatter(buffer);
    formatter.format("hello %1$s, %2$s and %3$s", "me", "myself", "I");

問題は、フォーマットを間違えた場合(たとえば、を忘れた場合$s)、例外がスローされることです。エラーメッセージをフォーマットするときに私が本当に望んでいることではありません(アプリケーションの通常のパスになく、テストされていない可能性があるため)。

もちろん、自分のクラスを定義することもできます。たとえば、のような文字列を受け入れ、 ( -> )"hello $1, $2 and $3で置換して、すべてのパラメーターに対してを呼び出すことができますが、より良いソリューションがすでに開発されていると確信しています。$1%1$stoString()

どこか、どこかの瓶に...

有用なポインタをありがとう。

編集

私は次のようなものを探しています:

String out = MySpecialFormatter.format("hello $1, $2 and $3", "me", "myself", "I");

フォーマットにエラーがある場合(タイプミスが存在する場合)、バインド変数を入力するか、元のフォーマット文字列を返すように最善を尽くします。

4

3 に答える 3

3

時々答えはそこにあります...

import static java.text.MessageFormat.format;

String out = format("hello {0}, {1} and {2}", "me", "myself", "2", "3");

そして、はい、アノン、どうやらサンは、すべてのプログラマーが怠け者だと思っていたようです。

于 2010-01-27T21:13:23.037 に答える
2

問題は、フォーマットを間違えると (たとえば、$s を忘れた場合)、例外がスローされることです。エラーメッセージをフォーマットするときに本当に欲しいものではありません(アプリケーションの通常のパスになく、テストされていない可能性があるため)。

つまり、基本的には、「自分のコードをテストしておらず、それが間違っている場合、対処する代わりにそれを隠すために何を使用できますか?」と尋ねていることになります。

解決策は、すべてのコードを適切にテストすることです。あなたがそれを書くとき、できれば。

悪いコードを隠蔽し、そこにないふりをすることを主張する場合は、次のことができます。

public class LazyProgrammersFormatter {
    private Formatter _f;

    public LazyProgrammersFormatter(Formatter f) {
        _f = f;
    }

    public bool format(/*can't be bothered looking up the varargs signature, you know what it is*/) {
        try {
            _f.format(/*etc.*/);
            return true;
        } catch (FormatException e) {
            return false;
        }
    }
}
于 2010-01-27T20:39:44.697 に答える
1

String.format は探しているものに適していませんか? 文字列形式のJava ドキュメント。

于 2010-01-27T20:40:38.080 に答える