Java - ¿Incluyendo variables dentro de cadenas?

114

Bien, entonces todos debemos saber que puede incluir variables en cadenas haciendo:

String string = "A string " + aVariable;

¿Hay alguna manera de hacerlo como:

String string = "A string {aVariable}";

En otras palabras: sin tener que cerrar las comillas y añadir el signo más. Es muy poco atractivo.

Adams gris
fuente
10
@Chandra Por favor, no pregunte por qué, sino explique si es posible. Así es como prefiero hacerlo. Gracias.
Gray Adams
3
Usa Groovy, entonces podrás hacer "Una cadena $ {aVariable}" todo lo que quieras.
Kaleb Brasee
2
Hay una gran variedad de técnicas para cosas similares que se analizan en esta pregunta , pero String.format()están integradas en el lenguaje.
ig0774
@KalebBrasee Eso suena perfecto, pero siempre dudo cuando se trata de modificar idiomas. No quiero retroceder.
Gray Adams
1
@GrayAdams Groovy no te hace retroceder, ¡te libera! : D
Kaleb Brasee

Respuestas:

123

Siempre puede usar String.format (....). es decir,

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

No estoy seguro de si eso es lo suficientemente atractivo para ti, pero puede ser muy útil. La sintaxis es la misma que para printf y java.util.Formatter. Lo he usado mucho, especialmente si quiero mostrar datos numéricos tabulares.

Aerodeslizador lleno de anguilas
fuente
2
Sé que esto es una cuestión de opinión, pero no veo cómo formates más atractivo que una simple expresión de concatenación de cadenas. Donde formatentra en juego es cuando necesita hacer relleno, formateo de números, etcétera.
Stephen C
1
@StephenC: No estoy en desacuerdo contigo en absoluto. Pero es una alternativa útil para el formato de cadenas, especialmente cuando se necesita hacer un relleno como dice y como digo arriba (es decir, para mostrar datos numéricos tabulares). Lo he usado bastante para formatear la química sanguínea y los informes de resultados de CBC.
Aerodeslizador lleno de anguilas
@StephenC Me gusta el formato por algunas razones: en primer lugar, '% d' usa el delimitador de línea de la plataforma. En segundo lugar, puede encontrar fácilmente todas las variables al final. Puede reformatear fácilmente o incluso reordenar las variables que ingresa. Es más fácil evitar errores (como 1 + "oops"), especialmente si usa FindBugs (que analiza cadenas de formato y parámetros de entrada). Y, como dice el autor de la pregunta, en muchos casos es más legible. Por supuesto, es una pena que el formatmétodo se haya hecho estático, fue un error de diseño bastante estúpido.
Maarten Bodewes
@owlstead - "Por supuesto, es una pena que el método de formato se haya hecho estático, fue un error de diseño bastante estúpido". . ¿Eh? ¿Cómo se formatrelacionaría con la cadena de destino? Seguramente no estás sugiriendo que deberíamos esperar que escribamos "A String %s %2d".format(aStringVar, anIntVar)... ¿verdad?
Stephen C
1
@owlstead - "asFormat" no sería correcto. Implica que el método está creando y devolviendo un objeto de formato.
Stephen C
70

Esto se llama interpolación de cadenas; no existe como tal en Java.

Un enfoque es utilizar String.format:

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

Otro enfoque es utilizar una biblioteca de plantillas como Velocity o FreeMarker .

Jacob Mattison
fuente
38

Considere también java.text.MessageFormat, que usa una sintaxis relacionada que tiene índices de argumentos numéricos. Por ejemplo,

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

resulta en stringcontener lo siguiente:

A string of ponies.

Más comúnmente, la clase se usa por su formato numérico y temporal. AquíJFreeChart se describe un ejemplo de formato de etiqueta ; la clase formatea el panel de estado de un juego.RCInfo

basurero
fuente
1
Para alguien que viene de CSharp, esta forma es más sencilla ya que es similar a string.Format en C #.
Mojtaba
0

puede usar el formato de cadena para incluir variables dentro de cadenas

uso este código para incluir 2 variables en la cadena:

String myString = String.format ("esta es mi cadena% s% 2d", variable1Name, variable2Name);

Alinn
fuente