문자열이 너무 긴 경우“…”로 어떻게자를 수 있습니까?


84

누군가가 좋은 아이디어를 가지고 있기를 바랍니다. 다음과 같은 문자열이 있습니다.

abcdefg
abcde
abc

내가 필요한 것은 지정된 길이보다 더 많은 경우 다음과 같이 표시되도록 잘리는 것입니다.

abc ..
abc ..
abc

이를 위해 사용할 수있는 간단한 C # 코드가 있습니까?


이 작업을 어디에서 찾고 있습니까? -Forms, WPF 앱 또는 웹 사이트에서-자세한 내용을 입력하세요!
Barry Kaye 2011

2
대부분의 솔루션의 문제는 Chars를 제한으로 사용한다는 것 입니다. 불행히도 그래픽 너비는 크게 다를 수 있습니다. 그리고 UTF-16 대용, 결합 자, ...가
CodesInChaos

12
이것은 제안 된 질문과 중복되지 않습니다. 이것은 매우 일반적인 질문이지만 제안 된 중복은 매우 구체적인 질문입니다.
JasonMArcher 2011

2
이것은 제안 된 질문과 절대적으로 중복되지 않습니다.
Seth

2
이 질문은 제안 된 중복 항목에 가깝지 않습니다. 중복 속성을 제거하세요. 고마워.
Daniel Leiszen 2010 년

답변:


146

다음은 확장 메서드에 래핑 된 논리입니다.

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

용법:

var s = "abcdefg";

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

1
브라이언 감사합니다. 당신의 대답은 좋아 보인다. 내 간단한 질문을 용서하십시오. 그러나 확장 방법을 어떻게 사용합니까?
Melony 2011-07-17

1
@Melony : 사용법을 포함하도록 편집되었습니다.
Bryan Watts

11
… (줄임표)는 관심있는 사람들을위한 올바른 기호입니다. 유니 코드 U + 2026.
Malako 2017-04-24

3
빠른 추가 널 검사를 포함하는
제임스

1
감사 @Malako: value.Substring(0, maxChars) + (char)0x2026;
피에르

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

실제로 THRESHOLD 변수가 필요하거나 항상 같은 크기 인 경우를 대비하여 명명 규칙을 무시하십시오.

또는

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

인라인으로 사용할 수있는 한 줄로 이것을 만들 수 있습니까?
Melony 2011-07-17

2
중간에서 코드 포인트를 분할하면 잘못된 문자열이 생성 될 수 있습니다. :(
CodesInChaos

7

모두 매우 좋은 대답이지만, 문자열이 문장 인 경우 조금만 정리하려면 단어 중간에서 문자열을 끊지 마십시오.

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

이것은 단어를 분해하지 않는 유일한 대답입니다. 따라서 유일한 올바른 IMO입니다.
mxmissile

@mxmissile-OP 데이터가 주어지면 "abcdefg"에 대해 3 자에서 자르고 "abc ..."로 이동합니다. 이것이 작동하더라도 전혀 올바르지 않습니다. OP 샘플 데이터는 연속 된 텍스트 중간에 하드 잘림을 명확하게 나타냅니다. 더 나쁜 것은이 대답이 오류를 생성한다는 것입니다. 데이터에 공백이 포함되어 있지 않으므로는 LastIndexOf-1을 반환하고은 Substring런타임 오류를 발생시킵니다.

4

다음은 타원의 길이를 설명하는 버전입니다.

    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
줄임표 문자를 사용하는 경우에는 그럴 필요가 없습니다. 그것의 문자 길이는 항상 1이됩니다const char ellipse = (char)0x2026;
피에르

3

이 작업을 수행하는 .NET Framework에는 기본 제공 메서드가 없지만 직접 작성하는 것은 매우 쉬운 방법입니다. 단계는 다음과 같습니다. 직접 만들어보고 결과를 알려주십시오.

  1. 메서드, 아마도 확장 메서드 만들기 public static void TruncateWithEllipsis(this string value, int maxLength)

  2. 전달 된 값이 속성을maxLength 사용하여 지정된 값보다 큰지 확인합니다 . 경우 보다 크지 단지를 반환합니다 .LengthvaluemaxLengthvalue

  3. 전달 된 값을있는 그대로 반환하지 않으면 잘라야한다는 것을 알 수 있습니다. 따라서 SubString메서드를 사용하여 문자열의 더 작은 섹션을 가져와야합니다 . 이 메서드는 지정된 시작 및 종료 값을 기반으로 문자열의 더 작은 섹션을 반환합니다. 끝 위치는 maxLength매개 변수 에 의해 전달 된 것이므로 사용하십시오.

  4. 문자열의 하위 섹션과 생략 부호를 반환합니다.

나중을위한 훌륭한 연습은 방법을 업데이트하고 완전한 단어 후에 만 ​​중단되도록하는 것입니다. 또한 오버로드를 생성하여 문자열이 잘린 것을 표시하는 방법을 지정할 수 있습니다. 예를 들어, 응용 프로그램이 클릭하여 더 자세한 정보를 표시하도록 설정된 경우 메서드는 "..."대신 "(더 보려면 클릭)"을 반환 할 수 있습니다.


2

뒤에있는 코드 :

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

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

    return s;
}

마크 업 :

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

어떻게 이것을 "<td>"+ string + "<\ td>"에 넣을 수 있습니까?
Melony 2011-07-17

2

그 목적을 위해 메소드를 구현하는 것이 더 낫습니다.

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

Substring 함수를 사용할 수 있습니다.


1

"C # truncate ellipsis"를 검색 한 후이 질문을 찾았습니다. 다양한 답변을 사용하여 다음과 같은 기능으로 나만의 솔루션을 만들었습니다.

  1. 확장 방법
  2. 줄임표 추가
  3. 줄임표를 선택 사항으로 설정
  4. 자르기를 시도하기 전에 문자열이 널 또는 비어 있지 않은지 확인하십시오.

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

다른 사람에게 도움이되기를 바랍니다.


0

물론입니다. 다음은 몇 가지 샘플 코드입니다.

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

0

최근에이 문제가 있습니다. 4000자인 nvarcharMAX DB 필드에 "status"메시지를 저장했습니다. 그러나 내 상태 메시지가 쌓여서 예외가 발생했습니다.

그러나 임의의 잘림이 상태 메시지의 일부를 고아로 만들 수 있기 때문에 단순한 잘림의 경우가 아니 었으므로 문자열의 일관된 부분에서 "잘라 내기"가 필요했습니다.

문자열을 문자열 배열로 변환하고 첫 번째 요소를 제거한 다음 문자열로 복원하여 문제를 해결했습니다. 다음은 코드입니다 ( "CurrentStatus"는 데이터를 포함하는 문자열입니다) ...

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


        }

누군가를 도울 수 있기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.