web-dev-qa-db-fra.com

% s dans String.format pour les nombres

Y a-t-il une raison de ne pas utiliser %s pour le spécificateur de format lors du formatage des nombres si aucun formatage supplémentaire n'est requis?

par exemple.

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

plutôt que le plus habituel:

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

La raison pour laquelle je demande est que je souhaite apporter des modifications automatisées au code source, et il serait gênant d'avoir à déterminer si le type de answer est int ou String ou autre chose

19
Simon Nickerson

Je m'attendrais à ce qu'il y ait une différence potentielle en termes de milliers de séparateurs et d'autres options spécifiques aux paramètres régionaux. La première approche va simplement appeler Integer.toString (qui n'est pas sensible aux paramètres régionaux) car Integer n'implémente pas Formattable. La seconde va utiliser une mise en forme d'entier potentiellement sensible aux paramètres régionaux - elle pourrait insérer des milliers de séparateurs, potentiellement même utiliser un ensemble différent de chiffres, etc.

En regardant les documents plus attentivement, il semble que les séparateurs de regroupement ne seront pas appliqués sans un indicateur de formatage spécifique, mais:

algorithme de localisation des nombres

Une fois les chiffres obtenus pour la partie entière, la partie fractionnaire et l'exposant (selon le type de données), la transformation suivante est appliquée:

  • Chaque caractère numérique d de la chaîne est remplacé par un chiffre spécifique aux paramètres régionaux calculé par rapport au chiffre zéro z des paramètres régionaux actuels; c'est-à-dire d - '0' + z.

Échantillon où cela fait une différence:

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