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 $?

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

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 .


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


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ę? :)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.