Tôi muốn cắt một chuỗi nếu độ dài vượt quá 10 ký tự.
Giả sử nếu độ dài chuỗi là 12 ( String s="abcdafghijkl"), thì chuỗi được cắt mới sẽ chứa "abcdefgh..".
Làm thế nào tôi có thể đạt được điều này?
Tôi muốn cắt một chuỗi nếu độ dài vượt quá 10 ký tự.
Giả sử nếu độ dài chuỗi là 12 ( String s="abcdafghijkl"), thì chuỗi được cắt mới sẽ chứa "abcdefgh..".
Làm thế nào tôi có thể đạt được điều này?
Câu trả lời:
s = s.substring(0, Math.min(s.length(), 10));
Sử dụng Math.minnhư thế này sẽ tránh được một ngoại lệ trong trường hợp chuỗi đã ngắn hơn 10.
Ghi chú:
Trên đây không cắt tỉa thực sự. Nếu bạn thực sự muốn thay thế ba ký tự (!) Cuối cùng bằng dấu chấm nếu nó cắt ngắn, thì hãy sử dụng Apache Commons StringUtils.abbreviate.
Điều này có thể hành xử không chính xác 1 nếu Chuỗi của bạn chứa các điểm mã Unicode bên ngoài BMP; ví dụ biểu tượng cảm xúc. Để biết giải pháp (phức tạp hơn) hoạt động chính xác cho tất cả các điểm mã Unicode, hãy xem giải pháp của @ sibnick .
1 - Một điểm mã Unicode không nằm trên mặt phẳng 0 (BMP) được biểu diễn dưới dạng "cặp thay thế" (nghĩa là hai chargiá trị) trong String. Bằng cách bỏ qua điều này, chúng tôi có thể cắt giảm ít hơn 10 điểm mã, hoặc (tệ hơn) cắt ngắn ở giữa một cặp thay thế. Mặt khác, String.length()không còn là thước đo lý tưởng cho độ dài văn bản Unicode, do đó, việc cắt xén dựa trên nó có thể là điều sai lầm.
s = (s.length() > 10) ? s.substring(0,10) : s ;
StringUtils.abbreviatetừ thư viện Apache Commons Lang có thể là bạn của bạn:
StringUtils.abbreviate("abcdefg", 6) = "abc..."
StringUtils.abbreviate("abcdefg", 7) = "abcdefg"
StringUtils.abbreviate("abcdefg", 8) = "abcdefg"
StringUtils.abbreviate("abcdefg", 4) = "a..."
Commons Lang3 thậm chí cho phép đặt Chuỗi tùy chỉnh làm điểm đánh dấu thay thế. Với điều này, ví dụ bạn có thể đặt một dấu chấm lửng ký tự.
StringUtils.abbreviate("abcdefg", "\u2026", 6) = "abcde…"
Có một StringUtilschức năng làm điều này.
s = StringUtils.left(s, 10)
Nếu các ký tự len không có sẵn hoặc Chuỗi là null, Chuỗi sẽ được trả về mà không có ngoại lệ. Một chuỗi rỗng được trả về nếu len âm.
StringUtils.left (null, ) = null
StringUtils.left ( , -ve) = ""
StringUtils.left ("", *) = ""
StringUtils.left ("abc", 0) = ""
StringUtils.left (" abc ", 2) =" ab "
StringUtils.left (" abc ", 4) =" abc "
Lịch sự: Steeve McCauley
Như thường lệ, không ai quan tâm đến các cặp thay thế UTF-16. Xem về chúng: Các ký tự Unicode không phải BMP phổ biến nhất trong sử dụng thực tế là gì? Ngay cả các tác giả của org.apache.commons / commons-lang3
Bạn có thể thấy sự khác biệt giữa mã chính xác và mã thông thường trong mẫu này:
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)));
}
}
Hoặc bạn chỉ có thể sử dụng phương pháp này trong trường hợp bạn không có StringUtils trên tay:
public static String abbreviateString(String input, int maxLength) {
if (input.length() <= maxLength)
return input;
else
return input.substring(0, maxLength-2) + "..";
}
Với Kotlin, nó đơn giản như:
yourString.take(10)
Trả về một chuỗi chứa n ký tự đầu tiên từ chuỗi này hoặc toàn bộ chuỗi nếu chuỗi này ngắn hơn.
Bạn dường như đang yêu cầu một ký tự dấu chấm lửng ( …) ở vị trí cuối cùng, khi cắt ngắn. Đây là một lớp lót để thao tác chuỗi đầu vào của bạn.
String input = "abcdefghijkl";
String output = ( input.length () > 10 ) ? input.substring ( 0 , 10 - 1 ).concat ( "…" ) : input;
Xem mã này chạy trực tiếp tại IdeOne.com.
abcdefghi
Chúng ta có thể tạo một lớp lót bằng cách sử dụng toán tử 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.
;
Xem mã này chạy trực tiếp tại IdeOne.com.
abcdefghi
Công cụ Luồng Java làm cho điều này trở nên thú vị, kể từ Java 9 trở lên. Thú vị, nhưng có lẽ không phải là cách tiếp cận tốt nhất.
Chúng tôi sử dụng các điểm mã hơn là charcác giá trị. Các charloại là di sản, và được giới hạn đến một tập hợp con của tất cả các khả năng Unicode ký tự.
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()
;
Nếu chúng ta có các ký tự thừa bị cắt bớt, hãy thay thế ký tự cuối cùng bằng dấu chấm lửng .
if ( input.length () > limit )
{
output = output.substring ( 0 , output.length () - 1 ) + "…";
}
Giá như tôi có thể nghĩ ra một cách để kết hợp đường truyền với phần "nếu vượt quá giới hạn, hãy thực hiện dấu chấm lửng".
str==null ? str : str.substring(0, Math.min(str.length(), 10))
hoặc là,
str==null ? "" : str.substring(0, Math.min(str.length(), 10))
Hoạt động với null.