Zrozumienie znaków $ w ciągach formatujących Javy

84
 StringBuilder sb = new StringBuilder();
 // Send all output to the Appendable object sb
 Formatter formatter = new Formatter(sb, Locale.US);

 // Explicit argument indices may be used to re-order output.
 formatter.format("%4$2s %3$2s %2$2s %1$2s", "a", "b", "c", "d")
 // -> " d  c  b  a"

W takim przypadku, dlaczego 2 jest dołączane do $?

andandandand
źródło

Odpowiedzi:

132

Nie 2ma to nic wspólnego z $:

  • %     = Początek ciągu formatu
  • 4$   = Czwarty argument („d”)
  • 2     = szerokość dwóch (wyrównanie do prawej)
  • s     = typ łańcucha
Sven Lilienthal
źródło
To naprawdę wyraźne wyjaśnienie dzięki. Jednak gdy używam% 4 $ 2s, a moja wartość argumentu to „ABCDEFGH”, nie jest pobierana tylko 2 znaki. Pobrał pełny ciąg. Czemu?
kandarp
49

Te 2$środki umieścić drugi argument z listy tutaj. $ Następujący numer nie poprzedza go. Podobnie 4$oznacza tutaj przedstawiony argument.

Aby wyjaśnić, możemy podzielić %2$2sformat na części:

  • % - wskazuje, że jest to ciąg formatu

  • 2$ - pokazuje, że należy tu umieścić drugi argument wartości

  • 2 - format ma dwa znaki

  • s - sformatuj wartość jako ciąg

Więcej informacji można znaleźć w dokumentacji .

Dave Webb
źródło
Faktycznie został odrzucony, kiedy była to zła odpowiedź. Jak to teraz jest poprawne, głos przeciw został usunięty.
Sven Lilienthal
1
@Sven - Odpowiedź nigdy się nie zmieniła, myślę, że musiałeś ją źle przeczytać. Dodałem, ale nie zmieniłem żadnej treści.
Dave Webb
Cóż, kiedy przegłosowałem, brzmiało: „2 $ oznacza, że ​​umieść tutaj drugi argument z listy”. Nie to uważam za poprawną odpowiedź.
Sven Lilienthal
Nadal mówi dokładnie to teraz, a ty powiedziałeś, że teraz jest poprawne.
Dave Webb
Samo w sobie jest to błędne lub przynajmniej nie odpowiada na pytanie, ale w kontekście, ma rację.
Sven Lilienthal
4

Są to argumenty pozycyjne, w których %4$2ssygnały formatowania czwartego argumentu jako łańcucha o szerokości 2. Jest to szczególnie przydatne, gdy podaje się łańcuchy do lokalizacji, gdzie argumenty muszą zostać uporządkowane bez dotykania kodu źródłowego.

Specyfikatory formatu dla typów, które są używane do reprezentowania dat i godzin, mają następującą składnię:

%[argument_index$][flags][width]conversion

Opcjonalne argument_indexto dziesiętna liczba całkowita wskazująca pozycję argumentu na liście argumentów. Do pierwszego argumentu odwołuje się "1$", do drugiego "2$", itd. - Dokumentacja programu formatującego

Joey
źródło
Mimo to bardziej lubię ciągi formatujące .NET, ponieważ sprawiają, że pozycja argumentów jest znacznie jaśniejsza.
Joey
4

%: ciąg formatu

4$: czwarty argument wartości

2: width (długość, gdy wypisywany jest argument)

s: to konwersja argumentów łańcuchowych

na przykład następujący fragment:

StringBuffer sb=new StringBuffer();

Formatter formatter=new Formatter(sb,Locale.UK);

formatter.format("-%4$5s-%3$5s-%2$5s-%1$5s-", "a", "b", "c", "d");

System.out.println(sb);

daje wynik:

-    d-    c-    b-    a-

(szerokość 5 znaków na argument, uzupełnione spacjami)

i zastąpienie 5przez 2, da następujący wynik:

- d- c- b- a-

Zobacz różnicę? :)

Rahul Mishra
źródło