web-dev-qa-db-fra.com

Comment puis-je tronquer mes chaînes avec un "..." si elles sont trop longues?

J'espère que quelqu'un a une bonne idée. J'ai des cordes comme ça:

abcdefg
abcde
abc

Ce dont j'ai besoin, c’est qu’ils soient capables de montrer comme ceci s’ils dépassent une certaine longueur:

abc ..
abc ..
abc

Existe-t-il un code C # simple que je puisse utiliser pour cela?

65
Melony

Voici la logique encapsulée dans une méthode d'extension:

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

Usage:

var s = "abcdefg";

Console.WriteLine(s.Truncate(3));
113
Bryan Watts
public string TruncString(string myStr, int THRESHOLD)
{
    if (myStr.Length > THRESHOLD)
        return myStr.Substring(0, THRESHOLD) + "...";
    return myStr;
}

Ignorer la convention de nommage, c'est juste au cas où il aurait réellement besoin de la variable THRESHOLD ou si elle a toujours la même taille.

Alternativement

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

Il n’existe pas de méthode intégrée dans le .NET Framework pour ce faire, mais c’est une méthode très facile à écrire vous-même. Voici les étapes, essayez de le faire vous-même et laissez-nous savoir ce que vous proposez.

  1. Créez une méthode, peut-être une méthode extensionpublic static void TruncateWithEllipsis(this string value, int maxLength)

  2. Vérifiez si la valeur transmise est supérieure à la maxLength spécifiée à l'aide de la propriété Length . Si value n'est pas supérieur à maxLength, renvoyez simplement value

  3. Si nous ne renvoyons pas la valeur passée telle quelle, nous savons que nous devons tronquer. Nous devons donc obtenir une section plus petite de la chaîne en utilisant la méthode SubString . Cette méthode renverra une plus petite section d'une chaîne en fonction des valeurs de début et de fin spécifiées. La position de fin est ce qui a été passé par le paramètre maxLength, utilisez-le donc. 

  4. Renvoie la sous-section de la chaîne plus les ellipses. 

Un bon exercice pour plus tard serait de mettre à jour la méthode et de ne la laisser casser qu'après des mots entiers. Vous pouvez également créer une surcharge pour indiquer comment vous souhaitez afficher une chaîne tronquée. Par exemple, la méthode peut renvoyer "(cliquez pour en savoir plus)" au lieu de "..." si votre application est configurée pour afficher plus de détails en cliquant sur. 

3
Bob

Voici une version qui prend en compte la longueur des ellipses: 

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

Code derrière:

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

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

    return s;
}

Balisage:

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

Peut-être est-il préférable d'appliquer une méthode à cette 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;
}
2
user586399

J'ai trouvé cette question après avoir recherché "Ellipsis tronconiques en C #". En utilisant diverses réponses, j'ai créé ma propre solution avec les fonctionnalités suivantes:

  1. Une méthode d'extension
  2. Ajouter un ellipsis
  3. Rendre les ellipsis facultatifs
  4. Vérifiez que la chaîne n'est pas nulle ou vide avant de tenter de la tronquer.

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

J'espère que ça aidera quelqu'un d'autre.

1
Tod Birdsall

Toutes les très bonnes réponses, mais pour nettoyer un peu, ne cassez pas votre corde au milieu d'une Word.

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) ;
    returnValue = tmp.Substring(0, tmp.LastIndexOf(' ') ) + " ...";
  }                
  return returnValue;
}
1
JStevens
string s = "abcdefg";
if (s.length > 3)
{
    s = s.substring(0,3);
}

Vous pouvez utiliser la fonction Substring.

1
Jethro

Bien sûr, voici un exemple de code:

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

J'ai ce problème récemment. Je stockais un message "status" dans un champ nvarcharMAX DB de 4 000 caractères. Cependant, mes messages d'état étaient en train de s'accumuler et de frapper l'exception. 

Mais ce n'était pas un simple cas de troncature, car une troncature arbitraire constituerait une partie orpheline d'un message d'état. J'ai donc vraiment besoin de "tronquer" une partie cohérente de la chaîne. 

J'ai résolu le problème en convertissant la chaîne en un tableau de chaînes, en supprimant le premier élément, puis en restaurant une chaîne. Voici le code ("CurrentStatus" est la chaîne contenant les données) ...

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


        }

J'espère que ça aide quelqu'un.

0
Darren Street