Dengan Python, saat memformat string, saya bisa mengisi placeholder dengan nama alih-alih dengan posisi, seperti itu:
print "There's an incorrect value '%(value)s' in column # %(column)d" % \
{ 'value': x, 'column': y }
Saya ingin tahu apakah itu mungkin di Jawa (mudah-mudahan, tanpa perpustakaan eksternal)?
java
string-formatting
Andy
sumber
sumber
%s
merupakan praktik umum. en.wikipedia.org/wiki/Printf_format_string#History Juga perhatikan bahwa beberapa IDE dan FindBugs mungkin secara otomatis mendeteksi jumlah% s dan% d yang tidak cocok, tetapi saya masih lebih suka kolom yang bernama.Jawaban:
StrSubstitutor dari jakarta commons lang adalah cara yang ringan untuk melakukan ini asalkan nilai Anda sudah diformat dengan benar.
http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/text/StrSubstitutor.html
Hasil di atas dalam:
"Ada nilai '1' yang salah di kolom # 2"
Saat menggunakan Maven Anda dapat menambahkan ketergantungan ini ke pom.xml Anda:
sumber
${arg}
) alih-alih yang kustom di atas (%(arg)
) maka regex tidak akan mengkompilasi, yang merupakan efek yang diinginkan.tidak cukup, tetapi Anda dapat menggunakan MessageFormat untuk referensi satu nilai beberapa kali:
Di atas dapat dilakukan dengan String.format () juga, tapi saya menemukan pembersih sintaks messageFormat jika Anda perlu membangun ekspresi kompleks, ditambah Anda tidak perlu peduli dengan jenis objek yang Anda masukkan ke dalam string
sumber
MessageFormat
bagus tapi tidak praktis untuk konten json yang relatif besarContoh lain dari Apache Common StringSubstitutor untuk placeholder bernama sederhana.
sumber
replaceIn
nilai pengganti mana yang menjadi buffer: StringBuilder, atau TextStringBuilder. Dengan pendekatan ini, seluruh isi file tidak akan dimuat ke dalam memori.Anda dapat menggunakan pustaka StringTemplate , ia menawarkan apa yang Anda inginkan dan banyak lagi.
sumber
'
char:unexpected char: '''
Untuk kasus-kasus yang sangat sederhana, Anda cukup menggunakan penggantian String hardcoded, tidak perlu perpustakaan di sana:
PERINGATAN : Saya hanya ingin menunjukkan kode sesederhana mungkin. Tentu saja JANGAN gunakan ini untuk kode produksi serius di mana masalah keamanan, seperti yang dinyatakan dalam komentar: melarikan diri, penanganan kesalahan dan keamanan adalah masalah di sini. Tetapi dalam kasus terburuk Anda sekarang tahu mengapa menggunakan lib 'baik' diperlukan :-)
sumber
Terima kasih atas seluruh bantuan Anda! Dengan menggunakan semua petunjuk Anda, saya telah menulis rutin untuk melakukan apa yang saya inginkan - pemformatan string seperti python menggunakan kamus. Karena saya pemula Java, setiap petunjuk sangat dihargai.
sumber
formatPos
tidak dapat menampungformatKey
.Ini adalah utas lama, tetapi hanya sebagai catatan, Anda juga bisa menggunakan gaya Java 8, seperti ini:
Pemakaian:
Outputnya adalah:
sumber
.reduce()
memperlakukan hasil substitusi antara sebagai format string mereka sendiri, solusi ini rentan terhadap format serangan string . Setiap solusi yang benar harus membuat satu melewati string format.Contoh:
sumber
.replaceAll()
panggilan balik penggantian string .Saya penulis perpustakaan kecil yang melakukan apa yang Anda inginkan:
Atau Anda dapat mengaitkan argumen:
sumber
Metode replaceEach Apache Commons Lang mungkin berguna tergantung pada kebutuhan spesifik Anda. Anda dapat dengan mudah menggunakannya untuk mengganti placeholder dengan nama dengan panggilan metode tunggal ini:
Diberikan beberapa input teks, ini akan menggantikan semua kemunculan placeholder di array string pertama dengan nilai yang sesuai di yang kedua.
sumber
Anda dapat memiliki sesuatu seperti ini di kelas helper string
sumber
Jawaban saya adalah:
a) gunakan StringBuilder bila memungkinkan
b) menjaga (dalam bentuk apa pun: integer adalah yang terbaik, khusus char seperti dolar makro dll) posisi "placeholder" dan kemudian gunakan
StringBuilder.insert()
(beberapa versi argumen).Menggunakan perpustakaan eksternal tampaknya berlebihan dan saya percaya menurunkan kinerja yang signifikan, ketika StringBuilder dikonversi ke String secara internal.
sumber
Berdasarkan jawaban yang saya buat
MapBuilder
kelas:kemudian saya membuat kelas
StringFormat
untuk pemformatan String:yang bisa Anda gunakan seperti itu:
sumber
Saya membuat juga kelas util / helper (menggunakan jdk 8) yang dapat memformat string dan menggantikan kemunculan variabel.
Untuk tujuan ini saya menggunakan metode Matchers "appendReplacement" yang melakukan semua substitusi dan loop hanya pada bagian yang terpengaruh dari string format.
Kelas pembantu saat ini tidak didokumentasikan dengan baik oleh javadoc. Saya akan mengubah ini di masa depan;) Pokoknya saya mengomentari baris yang paling penting (saya harap).
Anda dapat membuat instance kelas untuk Peta tertentu dengan nilai (atau awalan akhiran atau noKeyFunction) seperti:
Lebih jauh lagi, Anda dapat menentukan apa yang terjadi jika kunci dalam nilai-nilai Peta hilang (berfungsi dengan dua cara, mis. Nama variabel yang salah dalam format string atau kunci yang hilang di Peta). Perilaku default adalah pengecualian yang tidak dicentang yang dilemparkan (tidak dicentang karena saya menggunakan Fungsi jdk8 default yang tidak dapat menangani pengecualian yang diperiksa) seperti:
Anda dapat menentukan perilaku khusus dalam panggilan konstruktor seperti:
atau mendelegasikannya kembali ke perilaku default no key:
Untuk penanganan yang lebih baik ada juga representasi metode statis seperti:
sumber
Tidak ada yang dibangun ke Jawa pada saat penulisan ini. Saya akan menyarankan untuk menulis implementasi Anda sendiri. Preferensi saya adalah antarmuka pembangun fasih sederhana alih-alih membuat peta dan meneruskan fungsinya - Anda berakhir dengan sepotong kode yang berdekatan, misalnya:
Berikut ini adalah implementasi sederhana:
sumber
Coba Freemarker , templating library.
sumber
https://dzone.com/articles/java-string-format-examples String.format (inputString, [listOfParams]) akan menjadi cara termudah. Placeholder dalam string dapat ditentukan berdasarkan pesanan. Untuk lebih jelasnya periksa tautan yang disediakan.
sumber
Anda harus melihat perpustakaan resmi ICU4J . Ini menyediakan kelas MessageFormat mirip dengan yang tersedia dengan JDK tetapi mantan ini mendukung placeholder bernama.
Tidak seperti solusi lain yang disediakan di halaman ini. ICU4j adalah bagian dari proyek ICU yang dikelola oleh IBM dan diperbarui secara berkala. Selain itu, mendukung kasus penggunaan tingkat lanjut seperti pluralisasi dan banyak lagi.
Berikut ini contoh kode:
sumber
Ada Plugin Java untuk menggunakan interpolasi string di Jawa (seperti di Kotlin, JavaScript). Mendukung Java 8, 9, 10, 11 ... https://github.com/antkorwin/better-strings
Menggunakan variabel dalam string literal:
Menggunakan ekspresi:
Menggunakan fungsi:
Untuk info lebih lanjut, silakan baca proyek README.
sumber