Cara memformat string di Java

Jawaban:

140

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");

MessageFormatsedikit 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) });
ataylor
sumber
21
MessageFormat adalah untuk tujuan pelokalan, jadi berhati-hatilah saat menggunakannya. Misalnya kode berikut MessageFormat.format("Number {0}", 1234));tergantung pada lokal default yang dapat menghasilkan Number 1,234bukan Number 1234.
pavel_kazlou
@ ataylor: Halo, Maaf, tapi saya agak bingung. Saya ingin sesuatu seperti itu saya akan melewati objek Class yang memiliki data & kapan {0} it ll take firstname, kapan {1} then lastname, seperti itu. Apakah mungkin seperti itu {0,choice,0.getFirstName()}atau sesuatu seperti itu?
user3145373 ツ
@ user3145373 ツ Saya rasa tidak.
ataylor
Ok baiklah, saya telah merujuk satu proyek Net. Seperti yang saya inginkan, codeproject.com/Articles/42310/… , lihat proyek ini saya terlihat seperti ini. Jika Anda tahu ada proyek atau paket yang tersedia seperti itu maka tolong beri tahu saya. Terima kasih
user3145373 ツ
233

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:

  • % s - masukkan string
  • % d - masukkan bilangan bulat yang ditandatangani (desimal)
  • % f - masukkan bilangan real, notasi standar

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.

Martin Törnwall
sumber
2
Opsi lain adalah java.text.MessageFormat, yang menerima simbol format style {1}. Simbol format String.format () dapat mirip dengan simbol format printf () - tetapi juga bisa berbeda. Lihat download.oracle.com/javase/6/docs/api/java/util/… untuk sintaksis lengkap.
Andy Thomas
53
String.formatjuga dapat mengambil posisi numerik: String.format("%2$s %1$s", "foo", "bar");akan menampilkanbar foo
The Scrum Meister
7

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.

Ryan Amos
sumber
5
Jika Anda akan neg rep saya, tolong jelaskan mengapa.
Ryan Amos
11
1) Menanggapi pertanyaan tentang pemformatan string, Anda menjelaskan cara kerja +operator. 2) Penjelasan Anda bahkan tidak akurat. +setara dengan menggunakan StringBuilder, bukan String.concat. (Terlalu banyak info tentang ini.)
Søren Løvborg
6

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");
Tomasz Modelski
sumber
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" =========== =====================

Solusi Java

  • "-" digunakan untuk meninggalkan indentasi

  • "15" membuat panjang minimum String menjadi 15

  • "S" (yang merupakan beberapa karakter setelah%) akan diganti dengan String kami
  • 0 mengisi integer kita dengan 0s di sebelah kiri
  • Angka 3 menjadikan bilangan bulat kami menjadi panjang minimum 3
Ved Prakash
sumber
1
Anda benar docs.oracle.com/javase/8/docs/api/java/util/…
ℛɑƒæĿᴿᴹᴿ
1

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"

Felipe Bejarano
sumber
0

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;
}
DefconT34
sumber