2011-07-17 6 views
54

Espero que alguien tenga una buena idea. Tengo cadenas como esto:¿Cómo puedo truncar mis cadenas con un "..." si son demasiado largas?

abcdefg 
abcde 
abc 

Lo que necesito es para que puedan ser trucated para mostrar como esto si hay más de una longitud especificada:

abc .. 
abc .. 
abc 

¿Hay alguna sencilla de código C# que puedo utilizar para ¿esta?

+0

¿Dónde estás buscando hacer esto? - en una aplicación Forms o WPF o en un sitio web, ¡por favor brinde más detalles! –

+1

El problema con la mayoría de las soluciones es que usan una cantidad de 'Char's como límite. Lamentablemente, el ancho gráfico puede variar mucho. Y luego están los sustitutos UTF-16, combinando caracteres, ... – CodesInChaos

+11

Esto NO es un duplicado de la pregunta sugerida. Esta es una pregunta muy general, mientras que el duplicado sugerido es una pregunta extremadamente específica. – JasonMArcher

Respuesta

94

Aquí es la lógica envuelto en un método de extensión:

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

Uso:

var s = "abcdefg"; 

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

Gracias Bryan. Su respuesta es buena. Disculpe mi pregunta simple, pero ¿cómo utilizo un método de extensión? – Melony

+0

@Melony: Editado para incluir el uso. –

+3

... (puntos suspensivos) es el símbolo correcto para aquellos que se preocupan. Unicode U + 2026. – Malako

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

ignorar la convención de nombres es sólo en caso de que realmente necesita la variable umbral o si es siempre del mismo tamaño.

Alternativamente

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

¿Es posible hacer esto en algo con una línea que pueda usar en línea? – Melony

+0

Ok hará: P Lemme Editar respuesta –

+0

@Melony comprobar ahora: D –

1

Código atrás:

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

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

    return s; 
} 

de marcado:

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

¿Cómo podría encajar esto en: "" + cadena + "<\td>" ? – Melony

+0

@Melony Se ha actualizado la respuesta – VMAtm

2

Tal vez es mejor para poner en práctica un método para tal fin:

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

Puede usar la función Subcadena.

0

Claro, aquí es un código de ejemplo:

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

No hay una construida en el método en .NET Framework que hace esto, sin embargo, este es un método muy fácil de escribir usted mismo. Estos son los pasos, intente hacerlo usted mismo y díganos qué se le ocurre.

  1. crear un método, tal vez una extension methodpublic static void TruncateWithEllipsis(this string value, int maxLength)

  2. comprobación para ver si el pasado en el valor es mayor que el maxLength especificado mediante el Length property. Si el value no es mayor que maxLength, simplemente devuelva el value.

  3. Si no devolvimos el valor aprobado como está, entonces sabemos que debemos truncar. Entonces necesitamos obtener una sección más pequeña de la cadena usando SubString method. Ese método devolverá una sección más pequeña de una cadena en función de un valor de inicio y final especificado. La posición final es lo que pasó el parámetro maxLength, así que úselo.

  4. Regrese la subsección de la cadena más las elipsis.

Un gran ejercicio para más adelante sería actualizar el método y hacer que se rompa solo después de palabras completas. También puede crear una sobrecarga para especificar cómo le gustaría mostrar que una cadena ha sido truncada. Por ejemplo, el método podría devolver "(haga clic para obtener más información)" en lugar de "..." si su aplicación está configurada para mostrar más detalles haciendo clic.

0

Aquí hay una versión que da cuenta de la longitud de las elipses:

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

Encontré esta pregunta después de buscar "elipsis truncada de C#". Utilizando diversas respuestas, he creado mi propia solución con las siguientes características:

  1. un método de extensión
  2. Añadir una elipsis
  3. Hacer la elipsis opcional
  4. Validar que la cadena no es nulo o vacío antes intentando truncarlo.

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

espero que esto ayude a alguien más.

0

Tengo este problema recientemente. Estaba almacenando un mensaje de "estado" en un campo nvarcharMAX DB que tiene 4000 caracteres. Sin embargo, mis mensajes de estado se estaban acumulando y tocando la excepción.

Pero no era un caso simple de truncamiento, ya que un truncamiento arbitrario sería una parte huérfana de un mensaje de estado, así que realmente necesitaba "truncar" en una parte consistente de la cadena.

Resolví el problema convirtiendo la cadena en una matriz de cadenas, eliminando el primer elemento y luego restaurándolo a una cadena. Aquí está el código ("CurrentStatus" es la cadena que contiene los datos) ...

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


     } 

espero que ayude a alguien.

Cuestiones relacionadas