web-dev-qa-db-ja.com

このフォーマット文字列の何が問題になっていますか?

私はこのような文字列を持っています:

<string name="q_title" formatted="false">Item %d of %d</string>

私は次のようにString.formatでそれを使用しています:

String log = String.format(getString(R.string.q_title), 100, 500);

これまでのところ、出力に問題はありません。

ただし、Android Studioでのコード検査では、次のことがわかります。

フォーマット文字列 'q_title'は有効なフォーマット文字列ではないため、String.formatに渡さないでください。

どうして?

15

あなたの文字列は

_<string name="q_title" formatted="false">Item %1$d of %2$d</string>
_

そしてコード

_String log = getString(R.string.q_title, 100, 500);
_

複数の引数がある場合は、それらを1 $、2 $ ... n $でマークする必要があります。アラビア語では、言語の順序が逆になっているため、正しく変更する方法を知っている必要があります。

getString(id, args...)それ自体でフォーマットを実行します。

28
Roger Alien

パーセントについては、次のことが私のために働いた。

<string name="score_percent">%s%%</string>


getString(R.string.score_percent,"20")

整数を扱っている場合は、sをdに置き換えます

<string name="score_percent">%d%%</string>
8
Lazy Ninja

Blackbeltが投稿したリンク が示すように、まだこの答えを探している人にとって、文字列の正しい形式は次のようになります。

<string name="q_title">Item %1$d of %2$d</string>
2
ender

すべての特殊文字をエスケープするように注意してください

最後にパーセント文字「%」をエスケープするのを忘れたため、この文字列に問題がありました。

<string name="market_variation_formatter">%s %</string> 

良いエスケープ文字列は:

<string name="market_variation_formatter">%s \%</string>
1
Garytech

文字列をフォーマットする必要がある場合は、次のサンプルリソースに示すように、フォーマット引数を文字列リソースに配置することでフォーマットできます。

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

この例では、フォーマット文字列には2つの引数があります。%1 $ sは文字列で、%2 $ dは10進数です。次に、getString(int、Object ...)を呼び出して文字列をフォーマットします。例えば:

String text = getString(R.string.welcome_messages, username, mailCount);
0
younes