Java - Inclure des variables dans les chaînes?

114

Ok, donc nous devons tous savoir que vous pouvez inclure des variables dans des chaînes en faisant:

String string = "A string " + aVariable;

Y a-t-il un moyen de le faire comme:

String string = "A string {aVariable}";

En d'autres termes: sans avoir à fermer les guillemets et à ajouter des signes plus. C'est très peu attrayant.

Gray Adams
la source
10
@Chandra Veuillez ne pas demander pourquoi, mais plutôt expliquer si possible. C'est comme ça que je préférerais faire. Merci.
Grey Adams
3
Utilisez Groovy, vous pourrez alors faire "Une chaîne $ {aVariable}" tout ce que vous voulez.
Kaleb Brasee
2
Il existe toute une variété de techniques pour des choses similaires abordées dans cette question , mais elles String.format()sont intégrées au langage.
ig0774
@KalebBrasee Cela semble parfait, mais j'hésite toujours quand il s'agit de modifier les langues. Je ne veux pas me reculer.
Grey Adams
1
@GrayAdams Groovy ne vous fait pas reculer, il vous libère! : D
Kaleb Brasee

Réponses:

124

Vous pouvez toujours utiliser String.format (....). c'est à dire,

String string = String.format("A String %s %2d", aStringVar, anIntVar);

Je ne sais pas si cela vous convient suffisamment, mais cela peut être très pratique. La syntaxe est la même que pour printf et java.util.Formatter. Je l'ai beaucoup utilisé, surtout si je veux afficher des données numériques tabulaires.

Aéroglisseur plein d'anguilles
la source
2
Je sais que c'est une question d'opinion, mais je ne vois pas en quoi formatest plus attrayante qu'une simple expression de concaténation String. Ce qui formatprend tout son sens, c'est quand vous devez faire du remplissage, du formatage des nombres, etc.
Stephen C
1
@StephenC: Je ne suis pas du tout en désaccord avec vous. Mais c'est une alternative utile pour le formatage de chaînes, en particulier lorsque vous devez effectuer un remplissage comme vous le dites et comme je l'ai dit ci-dessus (c'est-à-dire pour afficher des données numériques tabulaires). Je l'ai beaucoup utilisé pour formater les rapports sur la chimie du sang et les résultats de CBC.
Aéroglisseur plein d'anguilles
@StephenC J'aime le format pour plusieurs raisons: tout d'abord, '% d' utilise le délimiteur de ligne de plate-forme. Deuxièmement, vous pouvez facilement trouver toutes les variables à la fin. Vous pouvez facilement reformater ou même réorganiser les variables que vous saisissez. Il est plus facile d'éviter les erreurs (comme 1 + "oops"), surtout si vous utilisez FindBugs (qui analyse les chaînes de format et les paramètres d'entrée). Et, comme le dit le demandeur, dans de nombreux cas, il est plus lisible. Bien sûr, c'est dommage que la formatméthode ait été rendue statique, c'était une erreur de conception plutôt stupide.
Maarten Bodewes
@owlstead - "Bien sûr, c'est dommage que la méthode de formatage ait été rendue statique, c'était une erreur de conception plutôt stupide." . Hein? Quel serait le formatrapport avec la chaîne cible? Vous ne suggérez sûrement pas que nous devrions être censés écrire "A String %s %2d".format(aStringVar, anIntVar)... n'est-ce pas?
Stephen C
1
@owlstead - "asFormat" ne serait pas correct. Cela implique que la méthode crée et renvoie un objet de format.
Stephen C
70

C'est ce qu'on appelle l'interpolation de chaîne; il n'existe pas en tant que tel en Java.

Une approche consiste à utiliser String.format:

String string = String.format("A string %s", aVariable);

Une autre approche consiste à utiliser une bibliothèque de modèles telle que Velocity ou FreeMarker .

Jacob Mattison
la source
38

Considérez également java.text.MessageFormat, qui utilise une syntaxe associée ayant des index d'arguments numériques. Par exemple,

String aVariable = "of ponies";
String string = MessageFormat.format("A string {0}.", aVariable);

aboutit à stringcontenir les éléments suivants:

A string of ponies.

Plus communément, la classe est utilisée pour sa mise en forme numérique et temporelle. Un exemple de JFreeChartformatage d'étiquette est décrit ici ; la classe met en RCInfoforme le volet d'état d'un jeu.

trashgod
la source
1
Pour quelqu'un venant de CSharp, cette façon est plus simple car elle est similaire à string.Format en C #.
Mojtaba
0

vous pouvez utiliser le format String pour inclure des variables dans des chaînes

J'utilise ce code pour inclure 2 variables dans la chaîne:

String myString = String.format ("ceci est ma chaîne% s% 2d", variable1Name, variable2Name);

Alinn
la source