Saya ingin memotong string jika panjangnya melebihi 10 karakter.
Misalkan jika panjang string adalah 12 ( String s="abcdafghijkl"
), maka string yang baru dipangkas akan berisi "abcdefgh.."
.
Bagaimana saya bisa mencapai ini?
Saya ingin memotong string jika panjangnya melebihi 10 karakter.
Misalkan jika panjang string adalah 12 ( String s="abcdafghijkl"
), maka string yang baru dipangkas akan berisi "abcdefgh.."
.
Bagaimana saya bisa mencapai ini?
Jawaban:
s = s.substring(0, Math.min(s.length(), 10));
Menggunakan Math.min
seperti 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 char
nilai) 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.
s = (s.length() > 10) ? s.substring(0,10) : s ;
StringUtils.abbreviate
dari perpustakaan Apache Commons Lang bisa menjadi teman Anda:
StringUtils.abbreviate("abcdefg", 6) = "abc..."
StringUtils.abbreviate("abcdefg", 7) = "abcdefg"
StringUtils.abbreviate("abcdefg", 8) = "abcdefg"
StringUtils.abbreviate("abcdefg", 4) = "a..."
Commons Lang3 bahkan memungkinkan untuk mengatur String khusus sebagai penanda pengganti. Dengan ini Anda dapat, misalnya, mengatur elipsis karakter tunggal.
StringUtils.abbreviate("abcdefg", "\u2026", 6) = "abcde…"
Ada StringUtils
fungsi Apache Commons yang melakukan ini.
s = StringUtils.left(s, 10)
Jika len karakter tidak tersedia, atau String adalah null, String akan dikembalikan tanpa kecuali. String kosong dikembalikan jika len negatif.
StringUtils.left (null, ) = null
StringUtils.left ( , -ve) = ""
StringUtils.left ("", *) = ""
StringUtils.left ("abc", 0) = ""
StringUtils.left (" abc ", 2) =" ab "
StringUtils.left (" abc ", 4) =" abc "
Courtesy: Steeve McCauley
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:
public static void main(String[] args) {
//string with FACE WITH TEARS OF JOY symbol
String s = "abcdafghi\uD83D\uDE02cdefg";
int maxWidth = 10;
System.out.println(s);
//do not care about UTF-16 surrogate pairs
System.out.println(s.substring(0, Math.min(s.length(), maxWidth)));
//correctly process UTF-16 surrogate pairs
if(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)));
}
}
Atau Anda bisa menggunakan metode ini jika Anda tidak memiliki StringUtils di tangan:
public static String abbreviateString(String input, int maxLength) {
if (input.length() <= maxLength)
return input;
else
return input.substring(0, maxLength-2) + "..";
}
System.out.println(abbreviateString("ABC\ud83d\udc3bDEF", 6));
Dengan Kotlin itu sesederhana:
yourString.take(10)
Mengembalikan string yang berisi n karakter pertama dari string ini, atau seluruh string jika string ini lebih pendek.
Anda tampaknya meminta karakter ellipsis ( …
) di tempat terakhir, saat memotong. Berikut ini adalah satu-liner untuk memanipulasi string input Anda.
String input = "abcdefghijkl";
String output = ( input.length () > 10 ) ? input.substring ( 0 , 10 - 1 ).concat ( "…" ) : input;
Lihat kode ini berjalan langsung di IdeOne.com.
abcdefghi ...
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.
;
Lihat kode ini berjalan langsung di IdeOne.com.
abcdefghi ...
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. The char
jenis warisan, dan terbatas pada subset dari semua kemungkinan Unicode karakter.
String input = "abcdefghijkl" ;
int limit = 10 ;
String output =
input
.codePoints()
.limit( limit )
.collect( // Collect the results of processing each code point.
StringBuilder::new, // Supplier<R> supplier
StringBuilder::appendCodePoint, // ObjIntConsumer<R> accumulator
StringBuilder::append // BiConsumer<R,R> combiner
)
.toString()
;
Jika kami memiliki karakter berlebih terpotong, ganti karakter terakhir dengan elipsis .
if ( input.length () > limit )
{
output = output.substring ( 0 , output.length () - 1 ) + "…";
}
Kalau saja saya bisa memikirkan cara untuk menyatukan garis aliran dengan bagian "jika melebihi batas, lakukan ellipsis".
str==null ? str : str.substring(0, Math.min(str.length(), 10))
atau,
str==null ? "" : str.substring(0, Math.min(str.length(), 10))
Bekerja dengan nol.