Pertanyaan primitif, tetapi bagaimana cara memformat string seperti ini:
"Langkah {1} dari {2}"
dengan mengganti variabel menggunakan Java? Dalam C # itu mudah.
Pertanyaan primitif, tetapi bagaimana cara memformat string seperti ini:
"Langkah {1} dari {2}"
dengan mengganti variabel menggunakan Java? Dalam C # itu mudah.
Jawaban:
Selain String.format, lihat juga java.text.MessageFormat
. Format kurang ringkas dan sedikit lebih dekat dengan contoh C # yang Anda berikan dan Anda dapat menggunakannya untuk parsing juga.
Sebagai contoh:
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));
Contoh yang lebih baik mengambil keuntungan dari varargs dan perbaikan autoboxing di Java 1.5 dan mengubah yang di atas menjadi satu-liner:
MessageFormat.format("String is \"{1}\", number is {0}.", 42, "foobar");
MessageFormat
sedikit lebih baik untuk melakukan bentuk jamak i18nized dengan pengubah pilihan. Untuk menentukan pesan yang menggunakan bentuk tunggal dengan benar ketika variabel 1 dan jamak sebaliknya, Anda bisa melakukan sesuatu seperti ini:
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));
tergantung pada lokal default yang dapat menghasilkan Number 1,234
bukan Number 1234
.
{0} it ll take firstname
, kapan {1} then lastname
, seperti itu. Apakah mungkin seperti itu {0,choice,0.getFirstName()}
atau sesuatu seperti itu?
Lihatlah String.format . Perhatikan, bagaimanapun, bahwa diperlukan penentu format yang mirip dengan keluarga fungsi printf C - misalnya:
String.format("Hello %s, %d", "world", 42);
Akan kembali "Halo dunia, 42". Anda mungkin menemukan ini membantu ketika mempelajari tentang penentu format. Andy Thomas-Cramer berbaik hati meninggalkan tautan ini dalam komentar di bawah, yang tampaknya mengarah pada spesifikasi resmi. Yang paling umum digunakan adalah:
Ini sangat berbeda dari C #, yang menggunakan referensi posisi dengan penentu format opsional. Itu berarti Anda tidak dapat melakukan hal-hal seperti:
String.format("The {0} is repeated again: {0}", "word");
... tanpa benar-benar mengulangi parameter yang diteruskan ke printf / format. (Lihat komentar The Scrum Meister di bawah ini)
Jika Anda hanya ingin mencetak hasilnya secara langsung, Anda mungkin menemukan System.out.printf ( PrintStream.printf ) sesuai dengan keinginan Anda.
String.format
juga dapat mengambil posisi numerik: String.format("%2$s %1$s", "foo", "bar");
akan menampilkanbar foo
Jika Anda memilih untuk tidak menggunakan String.format, opsi lainnya adalah + operator biner
String str = "Step " + a + " of " + b;
Ini setara dengan
new StringBuilder("Step ").append(String.valueOf(1)).append(" of ").append(String.valueOf(2));
Apa pun yang Anda gunakan adalah pilihan Anda. StringBuilder lebih cepat, tetapi perbedaan kecepatannya kecil. Saya lebih suka menggunakan +
operator (yang melakukan StringBuilder.append(String.valueOf(X)))
dan merasa lebih mudah dibaca.
+
operator. 2) Penjelasan Anda bahkan tidak akurat. +
setara dengan menggunakan StringBuilder
, bukan String.concat
. (Terlalu banyak info tentang ini.)
Saya telah menulis metode sederhana saya untuk itu:
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);
}
}
jadi kamu bisa menggunakannya sebagai:
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" =========== =====================
Solusi Java
"-" digunakan untuk meninggalkan indentasi
"15" membuat panjang minimum String menjadi 15
Solusi ini bekerja untuk saya. Saya perlu membuat url untuk klien REST secara dinamis, jadi saya membuat metode ini, jadi Anda hanya perlu melewati restURL seperti ini
/customer/{0}/user/{1}/order
dan tambahkan sebanyak mungkin params yang Anda butuhkan:
public String createURL (String restURL, Object ... params) {
return new MessageFormat(restURL).format(params);
}
Anda hanya perlu memanggil metode ini seperti ini:
createURL("/customer/{0}/user/{1}/order", 123, 321);
Hasil
"/ pelanggan / 123 / pengguna / 321 / pesanan"
Saya menulis fungsi ini, ia melakukan hal yang benar. Interpolasi kata yang dimulai dengan $
nilai variabel dengan nama yang sama.
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;
}