Menggunakan Math.minseperti ini menghindari pengecualian dalam kasus di mana string sudah lebih pendek dari 10.
Catatan:
Di atas tidak pemangkasan nyata. Jika Anda benar-benar ingin mengganti tiga (!) Karakter terakhir dengan titik-titik jika terpotong, maka gunakan Apache Commons StringUtils.abbreviate.
Ini mungkin berperilaku salah 1 jika String Anda berisi titik kode Unicode di luar BMP; mis. Emoji. Untuk solusi (lebih rumit) yang bekerja dengan benar untuk semua titik kode Unicode, lihat solusi @ sibnick .
1 - Suatu titik kode Unicode yang tidak ada pada bidang 0 (BMP) diwakili sebagai "pasangan pengganti" (yaitu dua charnilai) di String. Dengan mengabaikan ini, kita mungkin memotong kurang dari 10 poin kode, atau (lebih buruk) memotong di tengah pasangan pengganti. Di sisi lain, String.length()bukan lagi ukuran ideal panjang teks Unicode, jadi memangkas berdasarkan itu mungkin merupakan hal yang salah untuk dilakukan.
Alih-alih Math.min tidak bisakah kita melakukan pemeriksaan bersyarat dan melakukan substring hanya jika string maksimum maka diperlukan? mis:s = (s.length() > 10) ? s.substring(0,10) : s ;
rram
1
Ya, tentu saja kamu bisa. Baca jawaban lain untuk cara lain untuk menyelesaikan masalah!
Commons Lang3 bahkan memungkinkan untuk mengatur String khusus sebagai penanda pengganti. Dengan ini Anda dapat, misalnya, mengatur elipsis karakter tunggal.
Bisa jadi, tetapi pertanyaan OP tidak meminta "elipsis".
Stephen C
9
@StephenC - Pertanyaan menunjukkan 8 karakter diikuti oleh 2 titik, diberi batas panjang 10, yang sangat mirip dengan elipsis (hanya 2 titik daripada 3). Mungkin juga banyak orang yang menemukan pertanyaan ini akan menganggap elips berguna.
ToolmakerSteve
12
... dan jika Anda tidak menginginkan ellipsis, maka StringUtils.left () dapat membantu Anda.
Anda dapat melihat perbedaan antara kode yang benar dan kode biasa dalam sampel ini:
publicstaticvoid main(String[] args){//string with FACE WITH TEARS OF JOY symbolString s ="abcdafghi\uD83D\uDE02cdefg";int maxWidth =10;System.out.println(s);//do not care about UTF-16 surrogate pairsSystem.out.println(s.substring(0,Math.min(s.length(), maxWidth)));//correctly process UTF-16 surrogate pairsif(s.length()>maxWidth){int correctedMaxWidth =(Character.isLowSurrogate(s.charAt(maxWidth)))&&maxWidth>0? maxWidth-1: maxWidth;System.out.println(s.substring(0,Math.min(s.length(), correctedMaxWidth)));}}
Kita dapat membuat satu-liner dengan menggunakan operator ternary .
String input ="abcdefghijkl";String output =( input.length()>10)// If too long…?
input
.substring(0,10-1)// Take just the first part, adjusting by 1 to replace that last character with an ellipsis..concat("…")// Add the ellipsis character.:// Or, if not too long…
input // Just return original string.;
Jawaban:
Menggunakan
Math.min
seperti ini menghindari pengecualian dalam kasus di mana string sudah lebih pendek dari10
.Catatan:
Di atas tidak pemangkasan nyata. Jika Anda benar-benar ingin mengganti tiga (!) Karakter terakhir dengan titik-titik jika terpotong, maka gunakan Apache Commons
StringUtils.abbreviate
.Ini mungkin berperilaku salah 1 jika String Anda berisi titik kode Unicode di luar BMP; mis. Emoji. Untuk solusi (lebih rumit) yang bekerja dengan benar untuk semua titik kode Unicode, lihat solusi @ sibnick .
1 - Suatu titik kode Unicode yang tidak ada pada bidang 0 (BMP) diwakili sebagai "pasangan pengganti" (yaitu dua
char
nilai) diString
. Dengan mengabaikan ini, kita mungkin memotong kurang dari 10 poin kode, atau (lebih buruk) memotong di tengah pasangan pengganti. Di sisi lain,String.length()
bukan lagi ukuran ideal panjang teks Unicode, jadi memangkas berdasarkan itu mungkin merupakan hal yang salah untuk dilakukan.sumber
s = (s.length() > 10) ? s.substring(0,10) : s ;
StringUtils.abbreviate
dari perpustakaan Apache Commons Lang bisa menjadi teman Anda:Commons Lang3 bahkan memungkinkan untuk mengatur String khusus sebagai penanda pengganti. Dengan ini Anda dapat, misalnya, mengatur elipsis karakter tunggal.
sumber
Ada
StringUtils
fungsi Apache Commons yang melakukan ini.StringUtils.Left JavaDocs
Courtesy: Steeve McCauley
sumber
Seperti biasa tidak ada yang peduli tentang pasangan pengganti UTF-16. Lihat tentang mereka: Apa karakter Unicode non-BMP paling umum dalam penggunaan aktual? Bahkan penulis dari org.apache.commons / commons-lang3
Anda dapat melihat perbedaan antara kode yang benar dan kode biasa dalam sampel ini:
sumber
s = s.length() > 10 ? s.substring(0, 9) : s;
sumber
Atau Anda bisa menggunakan metode ini jika Anda tidak memiliki StringUtils di tangan:
sumber
System.out.println(abbreviateString("ABC\ud83d\udc3bDEF", 6));
Untuk berjaga-jaga jika Anda mencari cara untuk memotong dan menjaga 10 karakter TERAKHIR string.
sumber
Dengan Kotlin itu sesederhana:
Dokumentasi
sumber
tl; dr
Anda tampaknya meminta karakter ellipsis (
…
) di tempat terakhir, saat memotong. Berikut ini adalah satu-liner untuk memanipulasi string input Anda.Lihat kode ini berjalan langsung di IdeOne.com.
Operator ternary
Kita dapat membuat satu-liner dengan menggunakan operator ternary .
Lihat kode ini berjalan langsung di IdeOne.com.
Java stream
Fasilitas Java Streaming membuat ini menarik, seperti Java 9 dan yang lebih baru. Menarik, tapi mungkin bukan pendekatan terbaik.
Kami menggunakan poin kode daripada
char
nilai. Thechar
jenis warisan, dan terbatas pada subset dari semua kemungkinan Unicode karakter.Jika kami memiliki karakter berlebih terpotong, ganti karakter terakhir dengan elipsis .
Kalau saja saya bisa memikirkan cara untuk menyatukan garis aliran dengan bagian "jika melebihi batas, lakukan ellipsis".
sumber
atau,
Bekerja dengan nol.
sumber