Grundlegendes zum $ in Javas Formatzeichenfolgen

82
 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"

Warum wird in diesem Fall eine 2 an $ angehängt?

andandandand
quelle

Antworten:

129

Das 2hat nichts zu tun mit $:

  • %     = Beginn der Formatzeichenfolge
  • 4$   = Viertes Argument ('d')
  • 2     = Breite von zwei (rechtsbündig)
  • s     = Art der Zeichenfolge
Sven Lilienthal
quelle
Diese wirklich klare Erklärung, danke. Wenn ich jedoch% 4 $ 2s verwende und mein Argumentwert 'ABCDEFGH' ist, werden nicht nur 2 Zeichen abgerufen. Es wurde die vollständige Zeichenfolge abgerufen. Warum?
Kandarp
48

Die 2$Mittel setzen hier das zweite Argument aus der Liste. Es $ folgt eine Zahl, die nicht davor steht. Ebenso 4$bedeutet hier das vierte Argument.

Zur Verdeutlichung können wir das %2$2sFormat in seine Teile zerlegen:

  • % - gibt an, dass dies eine Formatzeichenfolge ist

  • 2$ - zeigt, dass das zweite Wertargument hier gesetzt werden sollte

  • 2 - Das Format ist zwei Zeichen lang

  • s - Formatieren Sie den Wert als String

Weitere Informationen finden Sie in der Dokumentation .

Dave Webb
quelle
Es wurde tatsächlich herabgestimmt, als es eine falsche Antwort war. Da es jetzt richtig ist, wurde die Downvote entfernt.
Sven Lilienthal
1
@Sven - Die Antwort hat sich nie geändert, ich denke du musst sie falsch gelesen haben. Ich habe Inhalte hinzugefügt, aber nicht geändert.
Dave Webb
Nun, als ich es herabgestimmt habe, lautete es: "Das 2 $ bedeutet, das zweite Argument aus der Liste hier zu setzen." Das würde ich nicht als richtige Antwort betrachten.
Sven Lilienthal
Es sagt immer noch genau das jetzt und du hast gesagt, es ist jetzt richtig.
Dave Webb
An sich ist es falsch oder beantwortet die Frage zumindest nicht, aber im Kontext ist es richtig.
Sven Lilienthal
4

Dies sind Positionsargumente, bei denen %4$2sSignale das vierte Argument als Zeichenfolge mit Breite 2 formatieren . Dies ist besonders hilfreich, wenn Zeichenfolgen für die Lokalisierung bereitgestellt werden, bei denen Argumente neu angeordnet werden müssen, ohne den Quellcode zu berühren.

Die Formatbezeichner für Typen, die zur Darstellung von Datum und Uhrzeit verwendet werden, haben die folgende Syntax:

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

Das optionale argument_indexist eine Dezimalzahl, die die Position des Arguments in der Argumentliste angibt. Das erste Argument wird von "1$", das zweite von "2$"usw. referenziert . - Formatierungsdokumentation

Joey
quelle
Trotzdem gefallen mir die Formatzeichenfolgen von .NET besser, da sie die Position von Argumenten viel klarer machen.
Joey
4

%: Formatzeichenfolge

4$: viertes Wertargument

2: width (Länge, wenn das Argument gedruckt wird)

s: Es ist eine String-Argument-Konvertierung

Zum Beispiel das folgende Snippet:

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);

erzeugt eine Ausgabe von:

-    d-    c-    b-    a-

(Breite von 5 Zeichen pro Argument, mit Leerzeichen aufgefüllt)

Wenn Sie 5durch ersetzen 2, wird die folgende Ausgabe erzeugt:

- d- c- b- a-

Sieh den Unterschied? :) :)

Rahul Mishra
quelle