Come formattare le stringhe in Java


Risposte:


140

Oltre a String.format, dai anche un'occhiata java.text.MessageFormat. Il formato è meno conciso e un po 'più vicino all'esempio C # che hai fornito e puoi usarlo anche per l'analisi.

Per esempio:

int someNumber = 42;
String someString = "foobar";
Object[] args = {new Long(someNumber), someString};
MessageFormat fmt = new MessageFormat("String is \"{1}\", number is {0}.");
System.out.println(fmt.format(args));

Un esempio più gradevole sfrutta i miglioramenti varargs e autoboxing in Java 1.5 e trasforma quanto sopra in una riga:

MessageFormat.format("String is \"{1}\", number is {0}.", 42, "foobar");

MessageFormatè un po 'più bello per fare i plurali i18nized con il modificatore di scelta. Per specificare un messaggio che utilizza correttamente la forma singolare quando una variabile è 1 e plurale altrimenti, puoi fare qualcosa del genere:

String formatString = "there were {0} {0,choice,0#objects|1#object|1<objects}";
MessageFormat fmt = new MessageFormat(formatString);
fmt.format(new Object[] { new Long(numberOfObjects) });

21
MessageFormat è a scopo di localizzazione, quindi fai attenzione quando lo usi. Ad esempio, al posto di MessageFormat.format("Number {0}", 1234));può produrre il seguente codice a seconda delle impostazioni internazionali predefinite . Number 1,234Number 1234
pavel_kazlou,

@ataylor: Ciao, scusa ma sono un po 'confuso. Voglio qualcosa del genere che passerò all'oggetto Class che ha dati e quando {0} it ll take firstname, quando {1} then lastname, così. È possibile {0,choice,0.getFirstName()}o qualcosa del genere?
user3145373 ツ

@ user3145373 ツ Non credo.
ataylor,

Ok bene, ho fatto riferimento a un progetto .Net come quello che desidero, codeproject.com/Articles/42310/… , fai riferimento a questo progetto. Se conosci progetti o pacchetti disponibili in quel modo, per favore dimmelo. Grazie
user3145373 ツ

233

Dai un'occhiata a String.format . Si noti, tuttavia, che accetta identificatori di formato simili a quelli della famiglia di funzioni printf di C, ad esempio:

String.format("Hello %s, %d", "world", 42);

Restituirebbe "Hello world, 42". Si possono trovare questo utile quando l'apprendimento circa le identificatori di formato. Andy Thomas-Cramer è stato così gentile da lasciare questo link in un commento qui sotto, che sembra indicare le specifiche ufficiali. I più comunemente usati sono:

  • % s - inserisce una stringa
  • % d - inserisce un numero intero con segno (decimale)
  • % f - inserisce un numero reale, notazione standard

Ciò è radicalmente diverso da C #, che utilizza riferimenti posizionali con un identificatore di formato opzionale. Ciò significa che non puoi fare cose come:

String.format("The {0} is repeated again: {0}", "word");

... senza ripetere effettivamente il parametro passato a printf / format. (vedi il commento di The Scrum Meister di seguito)


Se vuoi solo stampare direttamente il risultato, potresti trovare System.out.printf ( PrintStream.printf ) a tuo piacimento.


2
Un'altra opzione è java.text.MessageFormat, che accetta i simboli del formato di stile {1}. I simboli di formato String.format () possono essere simili ai simboli di formato printf () di C - ma possono anche differire. Vedi download.oracle.com/javase/6/docs/api/java/util/… per la sintassi completa.
Andy Thomas,

53
String.formatpuò anche assumere posizioni numeriche: String.format("%2$s %1$s", "foo", "bar");verrà emessobar foo
The Scrum Meister il

7

Se si sceglie di non utilizzare String.format, l'altra opzione è l'operatore + binario

String str = "Step " + a + " of " + b;

Questo è l'equivalente di

new StringBuilder("Step ").append(String.valueOf(1)).append(" of ").append(String.valueOf(2));

Qualunque cosa tu usi è la tua scelta. StringBuilder è più veloce, ma la differenza di velocità è marginale. Preferisco usare l' +operatore (che fa a StringBuilder.append(String.valueOf(X)))e lo trova più facile da leggere.


5
Se hai intenzione di negarmi, per favore spiega perché.
Ryan Amos,

11
1) In risposta a una domanda sulla formattazione delle stringhe, spieghi come funziona l' +operatore. 2) La tua spiegazione non è nemmeno accurata. +equivale a usare StringBuilder, no String.concat. (Troppe informazioni al riguardo.)
Søren Løvborg il

6

Ho scritto il mio metodo semplice per questo:

public class SomeCommons {
    /** Message Format like 'Some String {0} / {1}' with arguments */
    public static String msgFormat(String s, Object... args) {
        return new MessageFormat(s).format(args);
    }
}

così puoi usarlo come:

SomeCommons.msfgFormat("Step {1} of {2}", 1 , "two");

5
public class StringFormat {

    public static void main(String[] args) {
            Scanner sc=new Scanner(System.in);
            System.out.println("================================");
            for(int i=0;i<3;i++){
                String s1=sc.next();
                int x=sc.nextInt();
                System.out.println(String.format("%-15s%03d",s1,x));
            }
            System.out.println("================================");

    }
}

outpot "================================"
ved15space123 ved15space123 ved15space123 "=========== =====================

Soluzione Java

  • Il "-" è usato per lasciare il rientro

  • Il "15" rende la lunghezza minima della stringa che occupa 15

  • La "s" (che è di alcuni caratteri dopo%) verrà sostituita dalla nostra stringa
  • Lo 0 indica il nostro numero intero con 0 a sinistra
  • Il 3 rende il nostro numero intero una lunghezza minima di 3


1

Questa soluzione ha funzionato per me. Avevo bisogno di creare URL per un client REST in modo dinamico, quindi ho creato questo metodo, quindi devi solo passare il resto in questo modo

/customer/{0}/user/{1}/order

e aggiungi tutti i parametri di cui hai bisogno:

public String createURL (String restURL, Object ... params) {       
    return new MessageFormat(restURL).format(params);
}

Devi solo chiamare questo metodo in questo modo:

createURL("/customer/{0}/user/{1}/order", 123, 321);

Il risultato

"/ Cliente / 123 / user / 321 / ordine"


0

Ho scritto questa funzione che fa la cosa giusta. Interpolare una parola che inizia con $il valore della variabile con lo stesso nome.

private static String interpol1(String x){
    Field[] ffield =  Main.class.getDeclaredFields();
    String[] test = x.split(" ") ;
    for (String v : test ) {
        for ( Field n: ffield ) {
            if(v.startsWith("$") && ( n.getName().equals(v.substring(1))  )){
                try {
                    x = x.replace("$" + v.substring(1), String.valueOf( n.get(null)));
                }catch (Exception e){
                    System.out.println("");
                }
            }
        }
    }
    return x;
}
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.