web-dev-qa-db-ja.com

JavaのMessageFormat.format()を使用してメッセージをフォーマットします

リソースバンドルにいくつかのメッセージを保存しました。これらのメッセージを次のようにフォーマットしようとしています。

import Java.text.MessageFormat;

String text = MessageFormat.format("You're about to delete {0} rows.", 5);
System.out.println(text);

最初のパラメータ、つまり実際のメッセージは、何らかの方法で取得されるプロパティファイルに格納されていると仮定します。

2番目のパラメーター、つまり5は動的な値であり、発生しないプレースホルダー{0}に配置する必要があります。次の行が印刷され、

{0}行を削除しようとしています。

プレースホルダーは実際のパラメーターに置き換えられません。


ここのアポストロフィ-You'reYou\\'reのように通常通りエスケープしましたが、うまくいきませんでした。動作させるにはどのような変更が必要ですか?

53
Tiny

余分なアポストロフィを追加'MessageFormatパターンStringに追加して、'文字が表示されます

String text = 
     Java.text.MessageFormat.format("You''re about to delete {0} rows.", 5);
                                         ^

MessageFormatパターンのアポストロフィ(別名単一引用符)は、引用符付き文字列を開始し、それ自体では解釈されません。 javadoc から

単一引用符自体は、ストリング全体で二重引用符 ''で表す必要があります。

StringYou\\'reは、Stringにバックスラッシュ文字を追加することと同等です。そのため、唯一の違いはYou\reYoureではなく生成されます。 (二重引用符ソリューションの前に''適用済み)

98
Reimeus

必ず二重アポストロフィ( '')を使用してください。

String text = Java.text.MessageFormat.format("You''re about to delete {0} rows.", 5);
System.out.println(text);

編集:

文字列内では、単一引用符のペアを使用して、単一引用符を除く任意の文字を引用できます。たとえば、パターン文字列「 '{0}'」は、FormatElementではなく文字列「{0}」を表します。 ...

一致しない引用符は、指定されたパターンの終わりで閉じたものとして扱われます。たとえば、パターン文字列「 '{0}」はパターン「'{0} ' "。

ソース http://docs.Oracle.com/javase/7/docs/api/Java/text/MessageFormat.html

9
Adhikari

「You''re」では、単一ではなく二重アポストロフィを使用する必要があります。例:

String text = Java.text.MessageFormat.format("You''re about to delete {0} rows.", 5);
System.out.println(text);
6
FOOM

String.xmlにAndroid問題がある場合は、一重引用符ではなく\ '\'を使用してください。

3
Uriel Frankel

単一引用符の代わりにアポストロフィ\u2019(Unicode:')を使用すると、\'を二重化せずに問題が修正されました。

1
T Efron