web-dev-qa-db-ja.com

数値用のString.formatの%s

追加の書式設定が必要ない場合、数値を書式設定するときに書式指定子に%sを使用しない理由はありますか?

例えば.

int answer = 42;
String text = String.format("The answer is %s", answer);

より一般的ではなく:

int answer = 42;
String text = String.format("The answer is %d", answer);

私が尋ねる理由は、ソースコードに自動化された変更を行いたいので、answerのタイプがintStringまたは他の何か

19
Simon Nickerson

数千の区切り記号やその他のロケール固有のオプションに関して、潜在的な違いがあると予想しています。最初のアプローチは、IntegerFormattableを実装していないため、Integer.toString(ロケールに依存しない)を呼び出すだけです。 2番目は、ロケールに依存する可能性のある整数フォーマットを使用します-それはcould何千もの区切り文字を挿入し、潜在的に異なる数字セットなどを使用します。

ドキュメントをより注意深く見ると、グループ化セパレーターは特定のフォーマットフラグなしでは適用されないように見えますが、

数値ローカリゼーションアルゴリズム

整数部、小数部、および指数(データ型に応じて)の数字が取得された後、次の変換が適用されます。

  • 文字列内の各数字dは、現在のロケールのゼロ数字zに対して計算されたロケール固有の数字に置き換えられます。つまり、d-'0' + zです。

違いが生じるサンプル:

import Java.util.Locale;

public class Test {
  public static void main(String[] args) {
    Locale.setDefault(new Locale("hi", "IN"));
    System.out.printf("String: %s; Number: %d\n", 1234, 1234);
  }
}
34
Jon Skeet