web-dev-qa-db-fra.com

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

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 de la méthode de formatage ou existe-t-il une version abrégée qui vous permet de spécifier l'argument à appliquer une fois à tous les %s jetons?

122
Carey

De les docs :

  • 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'option argument_index 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);
234

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

Par exemple:

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

résulte en hello hello hello hello.

48
Daniel

Vous devez utiliser l'argument d'index 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

10
Ahmad Al-Kurdi

Un cas courant de réutilisation d'un argument dans String.format est avec 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’utilise que l’argument index (%2$s) pour les événements suivants:

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 être 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"
4
Eric Duminil