Réutiliser un paramètre dans String.format?

136
String hello = "Hello";

String.format("%s %s %s %s %s %s", hello, hello, hello, hello, hello, hello);

hello hello hello hello hello hello 

La variable hello doit-elle être répétée plusieurs fois dans l'appel à la méthode format ou existe-t-il une version abrégée qui vous permet de spécifier l'argument une fois à appliquer à tous les %sjetons?

Carey
la source

Réponses:

261

À partir de la documentation :

  • Les spécificateurs de format pour les types général, caractère et numérique ont la syntaxe suivante:

        %[argument_index$][flags][width][.precision]conversion

    L' argument_index facultatif est un entier décimal indiquant la position de l'argument dans la liste d'arguments. Le premier argument est référencé par "1$", le second par "2$", etc.

String.format("%1$s %1$s %1$s %1$s %1$s %1$s", hello);
Ignacio Vazquez-Abrams
la source
64

Une autre option consiste à utiliser l'indexation relative : le spécificateur de format référence le même argument que le dernier spécificateur de format.

Par exemple:

String.format("%s %<s %<s %<s", "hello")

se traduit par hello hello hello hello.

Daniel
la source
12

Vous devez utiliser l'argument d'indexation de l'utilisateur %[argument_index$]comme suit:

String hello = "Hello";
String.format("%1$s %1$s %1$s %1$s %1$s %1$s", hello);

Résultat : hello hello hello hello hello hello

Ahmad Al-Kurdi
la source
4

Un cas courant de réutilisation d'un argument dans String.formatest celui d'un séparateur (par exemple ";"pour CSV ou onglet pour console).

System.out.println(String.format("%s %2$s %s %2$s %s %n", "a", ";", "b", "c"));
// "a ; ; ; b"

Ce n'est pas la sortie souhaitée. "c"n'apparaît nulle part.

Vous devez d'abord utiliser le séparateur (avec %s) et n'utiliser l'argument index ( %2$s) que pour les occurrences suivantes:

System.out.println(String.format("%s %s %s %2$s %s %n", "a", ";", "b", "c"));
//  "a ; b ; c"

Des espaces sont ajoutés pour la lisibilité et le débogage. Une fois que le format semble correct, les espaces peuvent être supprimés dans l'éditeur de texte:

System.out.println(String.format("%s%s%s%2$s%s%n", "a", ";", "b", "c"));
// "a;b;c"
Eric Duminil
la source