Làm cách nào để cắt ngắn chuỗi của tôi bằng dấu “…” nếu chúng quá dài?


84

Hy vọng ai đó có một ý tưởng tốt. Tôi có chuỗi như thế này:

abcdefg
abcde
abc

Những gì tôi cần là để chúng hiển thị như thế này nếu nhiều hơn một độ dài được chỉ định:

abc ..
abc ..
abc

Có mã C # đơn giản nào mà tôi có thể sử dụng cho việc này không?


Bạn đang tìm cách làm điều này ở đâu? - trong ứng dụng Biểu mẫu hoặc WPF hoặc trang web - vui lòng cung cấp thêm chi tiết!
— Barry Kaye

2
Vấn đề với hầu hết các giải pháp là họ sử dụng một số Chars làm giới hạn. Thật không may, chiều rộng đồ họa có thể thay đổi rất nhiều. Và sau đó có UTF-16 thay thế, kết hợp ký tự, ...
— CodesInChaos

12
Đây KHÔNG phải là bản sao của câu hỏi đề xuất. Đây là một câu hỏi rất chung chung trong khi câu hỏi trùng lặp được đề xuất là một câu hỏi cực kỳ cụ thể.
— JasonMArcher

2
Đây hoàn toàn không phải là bản sao của câu hỏi gợi ý.
— Seth

2
Câu hỏi này thậm chí không gần với bản sao được đề xuất, vui lòng xóa thuộc tính trùng lặp. Cám ơn.
— Daniel Leiszen

Câu trả lời:


146

Đây là logic được gói gọn trong một phương thức mở rộng:

public static string Truncate(this string value, int maxChars)
{
    return value.Length <= maxChars ? value : value.Substring(0, maxChars) + "...";
}

Sử dụng:

var s = "abcdefg";

Console.WriteLine(s.Truncate(3));

1
Cảm ơn Bryan. Câu trả lời của bạn có vẻ tốt. Xin thứ lỗi cho câu hỏi đơn giản của tôi nhưng làm cách nào để sử dụng một phương pháp mở rộng?
— Melony

1
@Melony: Đã chỉnh sửa để bao gồm cách sử dụng.
— Bryan Watts

11
… (Dấu chấm lửng) là biểu tượng chính xác cho những ai quan tâm. Unicode U + 2026.
— Malako

3
bổ sung nhanh chóng để bao gồm một séc rỗng
— james

1
cảm ơn @Malako: value.Substring(0, maxChars) + (char)0x2026;
— Pierre

8
public string TruncString(string myStr, int THRESHOLD)
{
    if (myStr.Length > THRESHOLD)
        return myStr.Substring(0, THRESHOLD) + "...";
    return myStr;
}

Bỏ qua quy ước đặt tên, nó chỉ trong trường hợp anh ta thực sự cần biến THRESHOLD hoặc nếu nó luôn có cùng kích thước.

Ngoài ra

string res = (myStr.Length > THRESHOLD) ? myStr.Substring(0, THRESHOLD) + ".." : myStr;

Có thể biến điều này thành một cái gì đó với một dòng mà tôi có thể sử dụng nội tuyến không?
— Melony,

2
Điều này có thể tạo ra chuỗi không hợp lệ nếu nó chia tách một điểm mã trong :( giữa
— CodesInChaos

7

Tất cả các câu trả lời rất hay, nhưng để làm sạch nó một chút, nếu chuỗi của bạn là câu, đừng ngắt chuỗi của bạn ở giữa một từ.

private string TruncateForDisplay(this string value, int length)
{
  if (string.IsNullOrEmpty(value)) return string.Empty;
  var returnValue = value;
  if (value.Length > length)
  {
    var tmp = value.Substring(0, length) ;
    if (tmp.LastIndexOf(' ') > 0)
       returnValue = tmp.Substring(0, tmp.LastIndexOf(' ') ) + " ...";
  }                
  return returnValue;
}

Đây là câu trả lời duy nhất không ngắt lời. Do đó, IMO duy nhất đúng.
— mxmissile

@mxmissile - đã cung cấp dữ liệu OP, cho "abcdefg", cắt bớt 3 ký tự, chuyển thành "abc ...", ngay cả khi điều này hoạt động, nó sẽ không chính xác chút nào. Dữ liệu mẫu OP chỉ ra rõ ràng một đường cắt cứng ở giữa văn bản liền kề. Tệ hơn, vì nó là, câu trả lời này sẽ tạo ra một lỗi. Vì dữ liệu không chứa khoảng trắng nên giá trị LastIndexOfsẽ trả về -1 và Substringsẽ gây ra lỗi thời gian chạy.

4

Đây là một phiên bản tính theo chiều dài của hình elip:

    public static string Truncate(this string value, int maxChars)
    {
        const string ellipses = "...";
        return value.Length <= maxChars ? value : value.Substring(0, maxChars - ellipses.Length) + ellipses;
    }

4
nếu bạn sử dụng ký tự dấu chấm lửng thì không cần điều đó. Độ dài ký tự của nó sẽ luôn là 1const char ellipse = (char)0x2026;
— Pierre

3

Không có một phương pháp tích hợp nào trong .NET Framework thực hiện điều này, tuy nhiên đây là một phương pháp rất dễ dàng để bạn tự viết. Dưới đây là các bước, hãy thử tự làm và cho chúng tôi biết bạn nghĩ ra gì.

  1. Tạo một phương pháp, có lẽ là một phương thức mở rộng public static void TruncateWithEllipsis(this string value, int maxLength)

  2. Kiểm tra xem giá trị được truyền vào có lớn hơn giá trị được maxLengthchỉ định bằng thuộc Lengthtính hay không . Nếu valuekhông lớn hơn maxLength, chỉ cần trả về value.

  3. Nếu chúng ta không trả về giá trị đã truyền như hiện tại, thì chúng ta biết rằng chúng ta cần phải cắt bớt. Vì vậy, chúng ta cần lấy một phần nhỏ hơn của chuỗi bằng SubStringphương thức này . Phương thức đó sẽ trả về một phần nhỏ hơn của chuỗi dựa trên giá trị bắt đầu và kết thúc được chỉ định. Vị trí kết thúc là thông số được truyền vào maxLength, vì vậy hãy sử dụng vị trí đó.

  4. Trả lại phần con của chuỗi cộng với dấu chấm lửng.

Một bài tập tuyệt vời cho sau này là cập nhật phương pháp và chỉ ngắt nó sau khi các từ đầy đủ. Bạn cũng có thể tạo quá tải để chỉ định cách bạn muốn hiển thị một chuỗi đã bị cắt bớt. Ví dụ: phương thức có thể trả về "(nhấp để biết thêm)" thay vì "..." nếu ứng dụng của bạn được thiết lập để hiển thị chi tiết hơn bằng cách nhấp vào.


2

Mã ẩn:

string shorten(sting s)
{
    //string s = abcdefg;
    int tooLongInt = 3;

    if (s.Length > tooLongInt)
        return s.Substring(0, tooLongInt) + "..";

    return s;
}

Đánh dấu:

<td><%= shorten(YOUR_STRING_HERE) %></td>

Làm cách nào để tôi có thể lắp cái này vào: "<td>" + string + "<\ td>"?
— Melony

2

Có lẽ tốt hơn nên triển khai một phương pháp cho mục đích đó:

string shorten(sting yourStr)
{
//Suppose you have a string yourStr, toView and a constant value 

    string toView;
    const int maxView = 3;

    if (yourStr.Length > maxView)
        toView = yourStr.Substring(0, maxView) + " ..."; // all you have is to use Substring(int, int) .net method
    else
        toView = yourStr;
return toView;
}

1
string s = "abcdefg";
if (s.length > 3)
{
    s = s.substring(0,3);
}

Bạn có thể sử dụng chức năng Chuỗi con.


1

Tôi tìm thấy câu hỏi này sau khi tìm kiếm "Dấu chấm lửng cắt ngắn C #". Sử dụng các câu trả lời khác nhau, tôi đã tạo ra giải pháp của riêng mình với các tính năng sau:

  1. Một phương pháp mở rộng
  2. Thêm dấu chấm lửng
  3. Đặt dấu chấm lửng là tùy chọn
  4. Xác thực rằng chuỗi không rỗng hoặc trống trước khi cố gắng cắt ngắn nó.

    public static class StringExtensions
    {
        public static string Truncate(this string value, 
            int maxLength, 
            bool addEllipsis = false)
        {
            // Check for valid string before attempting to truncate
            if (string.IsNullOrEmpty(value)) return value;
    
            // Proceed with truncating
            var result = string.Empty;
            if (value.Length > maxLength)
            {
                result = value.Substring(0, maxLength);
                if (addEllipsis) result += "...";
            }
            else
            {
                result = value;
            }
    
            return result;
        }
    }
    

Tôi mong điều này giúp được người nào khác.


0

Chắc chắn, đây là một số mã mẫu:

string str = "abcdefg";
if (str.Length > X){
   str = str.Substring(0, X) + "...";
}

0

Tôi có vấn đề này gần đây. Tôi đang lưu trữ một thông báo "trạng thái" trong trường nvarcharMAX DB có 4000 ký tự. Tuy nhiên, các thông báo trạng thái của tôi đã được xây dựng và đạt được ngoại lệ.

Nhưng đây không phải là một trường hợp đơn giản của việc cắt ngắn vì một sự cắt ngắn tùy ý sẽ thiếu một phần của thông báo trạng thái, vì vậy tôi thực sự cần phải "cắt ngắn" ở một phần nhất quán của chuỗi.

Tôi đã giải quyết vấn đề bằng cách chuyển đổi chuỗi thành một mảng chuỗi, xóa phần tử đầu tiên và sau đó khôi phục thành chuỗi. Đây là mã ("CurrentStatus" là chuỗi chứa dữ liệu) ...

        if (CurrentStatus.Length >= 3750)
        {
            // perform some truncation to free up some space.

            // Lets get the status messages into an array for processing...
            // We use the period as the delimiter, then skip the first item and re-insert into an array.

            string[] statusArray = CurrentStatus.Split(new string[] { "." }, StringSplitOptions.None)
                                    .Skip(1).ToArray();

            // Next we return the data to a string and replace any escaped returns with proper one.
            CurrentStatus = (string.Join(".", statusArray))
                                    .Replace("\\r\\n", Environment.NewLine);


        }

Hy vọng nó sẽ giúp ai đó ra ngoài.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.