2011-12-14 44 views
78

Tôi muốn cắt một chuỗi nếu độ dài vượt quá 10 ký tự.Cắt chuỗi dựa trên độ dài chuỗi

Giả sử nếu độ dài chuỗi là 12 (String s="abcdafghijkl"), thì chuỗi được cắt ngắn mới sẽ chứa "abcdefgh..".

Tôi làm cách nào để đạt được điều này?

+5

có thể trùng lặp của [tối đa N ký tự đầu tiên] (http://stackoverflow.com/questions/1583940/up-to-first-n-characters) –

Trả lời

156
s = s.substring(0, Math.min(s.length(), 10)); 

Sử dụng Math.min như thế này tránh được một ngoại lệ trong trường hợp chuỗi đã ngắn hơn 10.


Ghi chú:

  1. Trên đây không cắt tỉa thật. 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.

  2. Điều này có thể hoạt động không chính xác 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. Để có giải pháp hoạt động chính xác cho tất cả các điểm mã Unicode, hãy xem @ sibnick's solution.


1 - Một điểm mã Unicode mà không phải là trên máy bay 0 (BMP) được thể hiện như là một "cặp thay thế" (ví dụ: hai char giá trị) trong String. Bằng cách bỏ qua điều này, chúng tôi có thể cắt í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 tỉa dựa trên đó có thể là điều không đúng.

+27

Một chút muộn cho bên, nhưng nếu sử dụng apache commons StringUtils , Tôi thích sử dụng s = StringUtils.left (s, 10), thay vì cố gắng phân loại ra bất kỳ nhà thiết kế nào của chuỗi con java() đang cố truyền đạt. Điều này cũng tránh được những nỗi kinh hoàng về việc ném một ngoại lệ để thực hiện một cái gì đó đơn giản như giải nén vài ký tự đầu tiên ra khỏi một chuỗi có độ dài không chắc chắn, một hoạt động không phổ biến. –

+1

@SteeveMcCauley - Để bảo vệ các nhà thiết kế Java, trong khi nó hơi không trực quan, đối số thứ 2 của 'split' là ký tự pos sau khi kết thúc chuỗi con, nó cũng có khả năng thuận tiện hơn để thực hiện theo cách đó trong nhiều trường hợp. Bên cạnh đó, đây là một cái gì đó mà một lập trình viên Java * có kinh nghiệm chỉ nhớ. –

+1

@SteeveMcCauley - và nó là một cái gì đó mà * thiếu kinh nghiệm * lập trình java nên tìm kiếm trong javadocs ... hơn là dựa vào trực giác. –

10

s = s.length() > 10 ? s.substring(0, 9) : s;

+8

Thông số thứ hai của chuỗi con là độc quyền, vì vậy câu trả lời này sẽ cắt chuỗi thành 9 ký tự. – emulcahy

81

StringUtils.abbreviate từ Apache Commons Lang thư viện 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..." 
+4

Có thể, nhưng câu hỏi của OP không yêu cầu "dấu ba chấm". –

+4

@StephenC - Câu hỏi hiển thị 8 ký tự theo sau là 2 dấu chấm, với giới hạn độ dài là 10, giống như dấu chấm lửng (chỉ 2 chấm thay vì 3). Nó cũng có khả năng là nhiều người trong số những người tìm thấy câu hỏi này sẽ xem xét một dấu ba chấm để có ích. – ToolmakerSteve

+0

thx tốt ... –

5

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) + ".."; 
} 
10

Như thường lệ, không ai quan tâm đến cặp thay thế UTF-16. Xem về họ: What are the most common non-BMP Unicode characters in actual use? tác giả Ngay cả các org.apache.commons/commons-lang3

Bạn có thể thấy sự khác biệt giữa mã đúng 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))); 
    } 
} 
20

Có một chức năng StringUtils mà thực hiện điều này .

s = StringUtils.left(s, 10) 

Nếu ký tự len không có sẵn, hoặc String là null, String sẽ được trả lại mà không có một ngoại lệ. Một chuỗi rỗng được trả về nếu len là âm.

StringUtils.left (null, ) = null
StringUtils.trái (
, -ve) = ""
StringUtils.left ("", *) = ""
StringUtils.left ("abc", 0) = ""
StringUtils.left ("abc", 2) = "ab"
StringUtils.left ("abc", 4) = "abc"

StringUtils.Left JavaDocs

Courtesy: Steeve McCauley

1

Chỉ trong trường hợp bạn đang tìm kiếm một cách để cắt và giữ 10 ký tự cuối cùng của một chuỗi.

s = s.substring (Math.max (s.length(), 10) - 10);

Các vấn đề liên quan