Capire $ nelle stringhe di formato di Java


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"

In questo caso, perché viene aggiunto un 2 a $?

Risposte:


134

Non 2ha nulla a che fare con $:

  • %     = Inizio della stringa di formato
  • 4$   = Quarto argomento ('d')
  • 2     = larghezza di due (allineato a destra)
  • s     = tipo di stringa

Questa spiegazione davvero nitida, grazie. Tuttavia, quando utilizzo% 4 $ 2s e il valore del mio argomento è "ABCDEFGH", non vengono recuperati solo 2 caratteri. Ha recuperato l'intera stringa. Perché?
kandarp

49

I 2$mezzi mettono qui il secondo argomento dalla lista. La $ segue un numero non lo precede. Allo stesso modo, 4$significa mettere qui il quarto argomento.

Per chiarire, possiamo suddividere il %2$2sformato nelle sue parti:

  • % - indica che questa è una stringa di formato

  • 2$ - mostra che il secondo argomento valore dovrebbe essere messo qui

  • 2 - il formato è lungo due caratteri

  • s - formatta il valore come una stringa

Puoi trovare maggiori informazioni nella documentazione .


In realtà è stato downvotato, quando era una risposta sbagliata. Poiché ora è corretto, il voto negativo è stato rimosso.
Sven Lilienthal

1
@Sven - La risposta non è mai cambiata, penso che tu abbia letto male. Ho aggiunto ma non modificato alcun contenuto.
Dave Webb

Bene, quando ho downvotato ho letto: "Il $ 2 significa mettere qui il secondo argomento dalla lista." Non è quello che considererei una risposta corretta.
Sven Lilienthal

Dice ancora esattamente questo ora e tu hai detto che ora è corretto.
Dave Webb

Di per sé, è sbagliato o almeno non rispondere alla domanda, ma contestualizzato, è giusto.
Sven Lilienthal

4

Questi sono argomenti posizionali in cui %4$2ssegnala di formattare il quarto argomento come una stringa di larghezza 2. Ciò è particolarmente utile quando si forniscono stringhe per la localizzazione in cui gli argomenti devono essere riordinati senza toccare il codice sorgente.

Gli identificatori di formato per i tipi utilizzati per rappresentare date e ore hanno la seguente sintassi:

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

L'opzionale argument_indexè un numero intero decimale che indica la posizione dell'argomento nell'elenco degli argomenti. Il primo argomento è referenziato da "1$", il secondo da "2$", ecc. - Documentazione del formattatore


Tuttavia, mi piacciono di più le stringhe di formato di .NET in quanto rendono molto più chiara la posizione degli argomenti.
Joey

4

%: stringa di formato

4$: quarto argomento del valore

2: larghezza (lunghezza quando l'argomento viene stampato)

s: è una conversione di argomenti stringa

ad esempio, il seguente 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);

produce un output di:

-    d-    c-    b-    a-

(larghezza di 5 caratteri per argomento, riempita con spazi)

e la sostituzione 5con 2, produrrà il seguente output:

- d- c- b- a-

Vedi la differenza? :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.