Java - w tym zmienne w łańcuchach?

114

Ok, więc wszyscy powinniśmy wiedzieć, że możesz dołączyć zmienne do łańcuchów, wykonując:

String string = "A string " + aVariable;

Czy jest na to sposób:

String string = "A string {aVariable}";

Innymi słowy: bez zamykania cudzysłowów i dodawania znaków plus. To bardzo nieatrakcyjne.

Gray Adams
źródło
10
@Chandra Proszę nie pytać dlaczego, ale raczej wyjaśnij, jeśli to możliwe. Po prostu wolałbym to zrobić. Dzięki.
Gray Adams
3
Użyj Groovy, a będziesz mógł zrobić „Ciąg $ {aVariable}”, ile chcesz.
Kaleb Brasee
2
W tym pytaniu omówiono wiele różnych technik , ale String.format()są one wbudowane w język.
ig0774
@KalebBrasee Brzmi idealnie, ale zawsze się waham, jeśli chodzi o modyfikowanie języków. Nie chcę się cofać.
Gray Adams,
1
@GrayAdams Groovy Cię nie cofa, ale wyzwala! : D
Kaleb Brasee

Odpowiedzi:

124

Zawsze możesz użyć String.format (....). to znaczy,

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

Nie jestem pewien, czy to jest dla Ciebie wystarczająco atrakcyjne, ale może być całkiem przydatne. Składnia jest taka sama jak dla printf i java.util.Formatter. Używałem go bardzo często, zwłaszcza jeśli chcę wyświetlić tabelaryczne dane liczbowe.

Poduszkowiec pełen węgorzy
źródło
2
Wiem, że to kwestia opinii, ale nie widzę, dlaczego formatjest bardziej atrakcyjne niż proste wyrażenie konkatenacji typu String. Najważniejsze formatjest to, gdy musisz wykonać dopełnienie, formatowanie liczb itp.
Stephen C
1
@StephenC: W ogóle się z tobą nie zgadzam. Jest to jednak użyteczna alternatywa dla formatowania ciągów znaków, zwłaszcza gdy trzeba wykonać dopełnienie tak, jak mówisz i jak powiedziałem powyżej (tj., Aby wyświetlić tabelaryczne dane liczbowe). Często używałem go do formatowania raportów z biochemii krwi i wyników CBC.
Poduszkowiec pełen węgorzy,
@StephenC Podoba mi się format z kilku powodów: po pierwsze, „% d” używa ogranicznika linii platformy. Po drugie, możesz łatwo znaleźć wszystkie zmienne na końcu. Możesz łatwo przeformatować, a nawet zmienić kolejność wprowadzanych zmiennych. Łatwiej jest uniknąć błędów (takich jak 1 + "oops"), zwłaszcza jeśli używasz FindBugs (który analizuje ciągi formatujące i parametry wejściowe). I, jak mówi pytający, w wielu przypadkach jest bardziej czytelny. Oczywiście szkoda, że formatmetoda została statyczna, to był raczej głupi błąd projektowy.
Maarten Bodewes
@owlstead - „Oczywiście szkoda, że ​​metoda formatu została zmieniona na statyczną, to był raczej głupi błąd projektowy”. . Co? Jak formatodnosiłby się do łańcucha docelowego? Na pewno nie sugerujesz, że powinniśmy pisać "A String %s %2d".format(aStringVar, anIntVar)... prawda?
Stephen C
1
@owlstead - „asFormat” nie byłoby właściwe. Oznacza to, że metoda tworzy i zwraca obiekt formatu.
Stephen C
70

Nazywa się to interpolacją ciągów; nie istnieje jako taka w Javie.

Jednym ze sposobów jest użycie String.format:

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

Innym podejściem jest użycie biblioteki szablonów, takiej jak Velocity lub FreeMarker .

Jacob Mattison
źródło
38

Weź również pod uwagę java.text.MessageFormat, która używa pokrewnej składni z numerycznymi indeksami argumentów. Na przykład,

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

powoduje, że stringzawiera:

A string of ponies.

Częściej klasa jest używana do formatowania liczbowego i czasowego. Przykład JFreeChartformatowania etykiet opisano tutaj ; klasa RCInfoformatuje okienko stanu gry.

trashgod
źródło
1
Dla kogoś pochodzącego z CSharp ten sposób jest prostszy, ponieważ jest podobny do string.Format w C #.
Mojtaba
0

możesz użyć formatu String, aby dołączyć zmienne do łańcuchów

używam tego kodu, aby zawrzeć 2 zmienne w ciągu:

String myString = String.format ("to jest mój ciąg% s% 2d", nazwa_zmiennej1, nazwa_zmiennej2);

alinn
źródło