Câu hỏi Cắt xén chuỗi trên toàn bộ các từ trong .NET C #


Tôi đang cố gắng cắt ngắn một số văn bản dài trong C #, nhưng tôi không muốn chuỗi của tôi bị cắt đứt một phần thông qua một từ. Có ai có một chức năng mà tôi có thể sử dụng để cắt xén chuỗi của tôi ở cuối một từ không?

Ví dụ:

"This was a long string..."

Không phải:

"This was a long st..."

58
2017-10-23 14:37


gốc


Bạn có thể đưa ra giải pháp hiện tại của bạn cho cắt xén? - pyrocumulus
@Cloud Chỉ .Substring (0, <số ký tự>) - TimS
Vâng, nếu <số ký tự> cao hơn chuỗi thực tế, chuỗi con sẽ ném một ngoại lệ, yêu cầu kiểm tra thêm. - Oskar Duveborn


Các câu trả lời:


Hãy thử những điều sau đây. Nó khá thô sơ. Chỉ cần tìm không gian đầu tiên bắt đầu ở độ dài mong muốn.

public static string TruncateAtWord(this string value, int length) {
    if (value == null || value.Length < length || value.IndexOf(" ", length) == -1)
        return value;

    return value.Substring(0, value.IndexOf(" ", length));
}

86
2017-10-23 14:40



Hoàn hảo! Và không phải là một regex trong tầm nhìn :) - TimS
Nó có thể có ý nghĩa để tìm không gian đầu tiên TRƯỚC KHI chiều dài mong muốn? Nếu không, bạn phải đoán xem chiều dài mong muốn là bao nhiêu? - mlsteeves
Cũng phải là -1 vì không sử dụng regex;) - Goran
Các @string sử dụng là không cần thiết-cho: nó không cần thiết và khó hiểu trong trường hợp này. Tham số có thể dễ dàng được đặt tên str. Nếu không cho điều đó, tôi sẽ có upvoted câu trả lời này. - LBushkin
Hoặc 'giá trị' được đề xuất. - user7116


Cảm ơn câu trả lời của bạn Dave. Tôi đã tinh chỉnh chức năng một chút và đây là những gì tôi đang sử dụng ... trừ khi có thêm bất kỳ ý kiến;)

public static string TruncateAtWord(this string input, int length)
{
    if (input == null || input.Length < length)
        return input;
    int iNextSpace = input.LastIndexOf(" ", length, StringComparison.Ordinal);
    return string.Format("{0}...", input.Substring(0, (iNextSpace > 0) ? iNextSpace : length).Trim());
}

74
2017-10-23 15:07



Hơn nữa, tôi cũng đang gọi một hàm tiện ích chuỗi khác từ bên trong cái này, loại bỏ bất kỳ thẻ HTML nào (sử dụng RegEx). Điều này giảm thiểu nguy cơ bị hỏng HTML do kết quả của việc cắt ngắn, vì tất cả chuỗi sẽ ở dạng văn bản thuần túy. - TimS
Lưu ý rằng phương pháp này tìm kiếm không gian đầu tiên SAU giá trị độ dài được chỉ định, hầu như luôn làm cho chuỗi kết quả dài hơn giá trị. Để tìm không gian cuối cùng trước khi chiều dài, chỉ cần thay thế input.LastIndexOf(" ", length) khi tính toán iNextSpace. - CBono
+100 cho nhận xét của CBono - điều này cần phải có trước đây! Trong eventofareallylongwordlikethisoneyouwillhaveaverylongstringthatisfarbeyondyourdesiredlength! - Jason
Có một ellipses char mà bạn có thể thêm thay vào đó. '…' - Örjan Jämte
Trong dòng 5 tôi sẽ đề nghị sử dụng: int iNextSpace = input.LastIndexOf(" ", length, System.StringComparison.Ordinal); cho các ký tự cụ thể về ngôn ngữ - Goran Žuri


Đóng góp của tôi:

public static string TruncateAtWord(string text, int maxCharacters, string trailingStringIfTextCut = "&hellip;")
{
    if (text == null || (text = text.Trim()).Length <= maxCharacters) 
      return text;

    int trailLength = trailingStringIfTextCut.StartsWith("&") ? 1 
                                                              : trailingStringIfTextCut.Length; 
    maxCharacters = maxCharacters - trailLength >= 0 ? maxCharacters - trailLength 
                                                     : 0;
    int pos = text.LastIndexOf(" ", maxCharacters);
    if (pos >= 0)
        return text.Substring(0, pos) + trailingStringIfTextCut;

    return string.Empty;
}

Đây là những gì tôi sử dụng trong các dự án của tôi, với dấu tùy chọn. Văn bản sẽ không bao giờ vượt quá độ dài văn bản cuối cùng của chuỗi ký tự tối đa.


5
2017-09-12 16:21



+1 cho việc sử dụng & hellip; :) - manudea


Nếu bạn đang sử dụng các biểu mẫu windows, trong phương thức Graphics.DrawString, có một tùy chọn trong StringFormat để xác định xem chuỗi có bị cắt ngắn hay không, nếu nó không vừa với khu vực được chỉ định. Điều này sẽ xử lý thêm dấu ba chấm khi cần thiết.

http://msdn.microsoft.com/en-us/library/system.drawing.stringtrimming.aspx


3
2017-10-23 14:49



Điều này là dành cho một trang ASP.Net, nhưng tôi làm một số công cụ Win Forms rất tốt để biết! - TimS


Giải pháp này cũng hoạt động (mất 10 từ đầu tiên từ myString):

String.Join(" ", myString.Split(' ').Take(10))

3
2018-03-14 11:05



Điều này thực sự khá gọn gàng. Có một số tình huống mà nó không phục vụ (word. ví dụ), nhưng nói chung là một cách tiếp cận dễ đọc.


Tôi đã tiếp cận thêm một chút:

public string TruncateAtWord(string value, int length)
{
    if (value == null || value.Trim().Length <= length)
        return value;

    int index = value.Trim().LastIndexOf(" ");

    while ((index + 3) > length)
        index = value.Substring(0, index).Trim().LastIndexOf(" ");

    if (index > 0)
        return value.Substring(0, index) + "...";

    return value.Substring(0, length - 3) + "...";
}

Tôi đang sử dụng điều này để cắt ngắn tweets.


2
2018-02-24 17:37





đơn giản, thêm tùy chọn ký tự trunking và làm cho nó một phần mở rộng.

    public static string TruncateAtWord(this string value, int maxLength)
    {
        if (value == null || value.Trim().Length <= maxLength)
            return value;

        string ellipse = "...";
        char[] truncateChars = new char[] { ' ', ',' };
        int index = value.Trim().LastIndexOfAny(truncateChars);

        while ((index + ellipse.Length) > maxLength)
            index = value.Substring(0, index).Trim().LastIndexOfAny(truncateChars);

        if (index > 0)
            return value.Substring(0, index) + ellipse;

        return value.Substring(0, maxLength - ellipse.Length) + ellipse;
    }

1
2017-07-24 10:21



điều này chỉ đơn giản là không hoạt động như dự định. Xin vui lòng ít nhất làm một kiểm tra sanity trước khi gửi bài bất cứ điều gì ở đây. - avs099


Heres những gì tôi đã đưa ra. Điều này là để có được phần còn lại của câu cũng trong khối.

public static List<string> SplitTheSentenceAtWord(this string originalString, int length)
    {
        try
        {
            List<string> truncatedStrings = new List<string>();
            if (originalString == null || originalString.Trim().Length <= length)
            {
                truncatedStrings.Add(originalString);
                return truncatedStrings;
            }
            int index = originalString.Trim().LastIndexOf(" ");

            while ((index + 3) > length)
                index = originalString.Substring(0, index).Trim().LastIndexOf(" ");

            if (index > 0)
            {
                string retValue = originalString.Substring(0, index) + "...";
                truncatedStrings.Add(retValue);

                string shortWord2 = originalString;
                if (retValue.EndsWith("..."))
                {
                    shortWord2 = retValue.Replace("...", "");
                }
                shortWord2 = originalString.Substring(shortWord2.Length);

                if (shortWord2.Length > length) //truncate it further
                {
                    List<string> retValues = SplitTheSentenceAtWord(shortWord2.TrimStart(), length);
                    truncatedStrings.AddRange(retValues);
                }
                else
                {
                    truncatedStrings.Add(shortWord2.TrimStart());
                }
                return truncatedStrings;
            }
            var retVal_Last = originalString.Substring(0, length - 3);
            truncatedStrings.Add(retVal_Last + "...");
            if (originalString.Length > length)//truncate it further
            {
                string shortWord3 = originalString;
                if (originalString.EndsWith("..."))
                {
                    shortWord3 = originalString.Replace("...", "");
                }
                shortWord3 = originalString.Substring(retVal_Last.Length);
                List<string> retValues = SplitTheSentenceAtWord(shortWord3.TrimStart(), length);

                truncatedStrings.AddRange(retValues);
            }
            else
            {
                truncatedStrings.Add(retVal_Last + "...");
            }
            return truncatedStrings;
        }
        catch
        {
            return new List<string> { originalString };
        }
    }

1
2017-07-25 22:52





Tôi dùng cái này

public string Truncate(string content, int length)
    {
        try
        {
            return content.Substring(0,content.IndexOf(" ",length)) + "...";
        }
        catch
        {
            return content;
        }
    }

-1
2017-08-10 06:50