Domanda primitiva, ma come posso formattare le stringhe in questo modo:
"Passaggio {1} di {2}"
sostituendo le variabili usando Java? In C # è facile.
Domanda primitiva, ma come posso formattare le stringhe in questo modo:
"Passaggio {1} di {2}"
sostituendo le variabili usando Java? In C # è facile.
Risposte:
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) });
MessageFormat.format("Number {0}", 1234));
può produrre il seguente codice a seconda delle impostazioni internazionali predefinite . Number 1,234
Number 1234
{0} it ll take firstname
, quando {1} then lastname
, così. È possibile {0,choice,0.getFirstName()}
o qualcosa del genere?
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:
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.
String.format
può anche assumere posizioni numeriche: String.format("%2$s %1$s", "foo", "bar");
verrà emessobar foo
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.
+
operatore. 2) La tua spiegazione non è nemmeno accurata. +
equivale a usare StringBuilder
, no String.concat
. (Troppe informazioni al riguardo.)
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");
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
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"
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;
}