web-dev-qa-db-fra.com

Chaîne de format correcte pour String.format ou similaire

Je suis sûr d'avoir vu String.format utilisé comme ceci auparavant:

String.format("Some {1}, {2}, {3}", var1, var2, var3);

Est-ce que cela vous dit quelque chose? Peut-être que je pense à C #, y a-t-il un moyen d'y parvenir en java?

Je sais que tu peux faire quelque chose comme:

String.format("Some %s, %d, %s", aString, aNumber, aString)

mais la syntaxe que je recherche est pour la première ...

30
auser

Ce que vous recherchez est MessageFormat , qui utilise un format et des paramètres d'entrée donnés, par ex.

MessageFormat.format("Some {0}, {1}, {2}", var1, var2, var3);

Et comme déjà mentionné, String.format peut toujours faire le travail en utilisant la syntaxe alternative, mais elle est moins puissante en fonctionnalités et non pas ce que vous avez demandé.

37
Tobias N. Sasse

Oui, c'est la chaîne typique format de C # . En Java, vous pouvez utiliser ce dernier, c'est-à-dire String.format("%s %d %d", ...).

Une alternative consiste à utiliser MessageFormat.format("Some {0}, {1}, {2}", var1, var2, var3), qui utilise la notation d'accolades .NET, comme mentionné par @Tobias, même si cela vous oblige importer Java.text.MessageFormat . Ils conviennent également mieux lorsque vous traitez avec des ressources localisées, lorsque vous disposez généralement de .properties fichiers contenant des messages au format Error {0} ocurred due to {1}.

12
João Silva

Je n'aime pas spécifier à la fois l'index du paramètre ou son type - principalement lors du lancement d'une exception et de la préparation d'un message. J'aime la façon dont SLF4j le fait. J'ai donc enveloppé org.slf4j.helpers.MessageFormatter comme ceci:

public static String subst(String string, Object...objects) {
    return MessageFormatter.arrayFormat(string, objects).getMessage();
}

Ensuite, vous pouvez l'utiliser comme ceci:

public void main(String[] args) {
    throw new RuntimeException(MyUtils.subst("Problem with A={} and B={}!", a, b));
}
10
Jaroslav Kuboš