programing tip

.NET C #에서 전체 단어의 문자열 자르기

itbloger 2020. 11. 26. 07:59
반응형

.NET C #에서 전체 단어의 문자열 자르기


C #에서 긴 텍스트를 자르려고하지만 문자열이 단어를 통해 부분적으로 잘리는 것을 원하지 않습니다. 누구든지 단어 끝에서 내 문자열을 자르는 데 사용할 수있는 기능이 있습니까?

예 :

"This was a long string..."

아니:

"This was a long st..."

다음을 시도하십시오. 꽤 초보적입니다. 원하는 길이에서 시작하는 첫 번째 공백을 찾습니다.

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));
}

답변 Dave에 감사드립니다. 나는 기능을 약간 조정했고 이것이 내가 사용하는 것입니다 ... 더 이상 주석이 없다면;)

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());
}

내 기여 :

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;
}

이것은 선택적인 후행과 함께 내 프로젝트에서 사용하는 것입니다. 텍스트는 maxCharacters + 후행 텍스트 길이를 초과하지 않습니다.


Windows Forms를 사용하는 경우 Graphics.DrawString 메서드에는 지정된 영역에 맞지 않는 경우 문자열을자를 지 여부를 지정하는 StringFormat의 옵션이 있습니다. 필요한 경우 줄임표 추가를 처리합니다.

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


이 솔루션도 작동합니다 (myString에서 처음 10 개 단어 가져 오기).

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

나는 당신의 접근 방식을 조금 더 취했습니다.

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

트윗을 자르는 데 이것을 사용하고 있습니다.


단순화되고 트렁킹 문자 옵션이 추가되어 확장되었습니다.

    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;
    }

여기에 내가 생각해 낸 것이 있습니다. 이것은 문장의 나머지 부분도 덩어리로 가져 오는 것입니다.

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 };
        }
    }

나는 이것을 사용한다

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

참고 URL : https://stackoverflow.com/questions/1613896/truncate-string-on-whole-words-in-net-c-sharp

반응형