2012-04-04 29 views
20

Mi trovo molto spesso a voler scrivere stringhe riutilizzabili con i segnaposti dei parametri in esse, quasi esattamente come quelle che si trovano in una preparazione preliminare SQL.Stringhe parametrizzate in Java

Ecco un esempio

private static final String warning = "You requested ? but were assigned ? instead."; 

public void addWarning(Element E, String requested, String actual){ 

    warning.addParam(0, requested); 
    warning.addParam(1, actual); 
    e.setText(warning); 
    //warning.reset() or something, I haven't sorted that out yet. 
} 

fa qualcosa del genere esistono già in Java? O c'è un modo migliore per affrontare qualcosa di simile?

Quello che veramente sto chiedendo: è questo ideale?

risposta

40

String.format()

Dal Java 5, è possibile utilizzare String.format per parametrizzare le stringhe. Esempio:

String fs; 
fs = String.format("The value of the float " + 
        "variable is %f, while " + 
        "the value of the " + 
        "integer variable is %d, " + 
        " and the string is %s", 
        floatVar, intVar, stringVar); 

Vedi http://docs.oracle.com/javase/tutorial/java/data/strings.html

In alternativa, si può solo creare un wrapper per il String fare qualcosa di più di fantasia.

MessageFormat

Per il commento di Max e answer by Affe, è possibile localizzare il vostro String parametrizzato con la classe MessageFormat.

+0

Non posso credere che ho trascurato questa Grazie Garrett – JHarnach

+1

E utilizzare la classe MessageFormat se si desidera formattare le stringhe in una lingua e in un modo indipendente dalla lingua. La localizzazione di – Max

6

Si potrebbe utilizzare String.format. Qualcosa di simile:

String message = String.format("You requested %2$s but were assigned %1$s", "foo", "bar"); 

genererà

"You requested bar but were assigned foo" 
0

Beh se la vostra String era final sicuro che non sarebbe in grado di modificare in un secondo momento. Non so se forse si potrebbe trovare un caso uso migliore per questo genere di cose, come si può semplicemente fare:

public void addWarning(Element E, String requested, String actual){ 

    String warning = "You requested" + requested + " but were assigned " + actual + " instead."  
    e.setText(warning); 
} 
0

avrei probabilmente fare qualcosa di simile:

private final String warning = String.format("You requested %s but were assigned %s instead.", requested, actual); 

Se si voleva mettere la stringa di parametri prima della chiamata a formattare la stringa si potrebbe fare qualcosa di simile a quello che si vede sotto, anche se questo è meno chiaro.

Nessuna di queste soluzioni è intrinsecamente localizzabile; si consiglia di prendere in considerazione qualcosa come un file .properties se si desidera supportare impostazioni locali non inglesi.

private static final String warning = "You requested %s but were assigned %s instead."; 

public void addWarning(Element E, String requested, String actual){ 
    e.setText(String.format(warning, requested, actual); 
    //warning.reset() or something, I haven't sorted that out yet. 
} 
+0

potrebbe diventare rilevante lungo la strada, non l'avevo presa in considerazione. – JHarnach

0

il formatter può fare questo per voi (con alcuni extra come l'aggiunta di zeri spaziatura cose e più)

avvertimento static final String privato = "E 'stata richiesta% 1 $ s, ma è stato assegnato% 2 $ s invece.";

public void addWarning(Element E, String requested, String actual){ 
    Formatter f = new Formatter();//you'll need to recreate it each time 
    try{ 
     f.format(warning,requested,actual); 
     e.setText(f.out().toString()); 
    }finally{f.close();} 

} 
0

La classe String fornisce il seguente metodo format, http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html Per esempio (come per il post originale):..!

private final static String string = "You requested %s but were assigned %s instead."; 

public void addWarning(Element e, String requested, String actual) { 
String warning = String.format(string, requested, actual); 
e.setText(warning);