Displaying The First n Characters Of Text
public static class StringExtensions { /// <summary> /// Returns part of a string up to the specified number of characters, while maintaining full words /// </summary> /// <param name="s"></param> /// <param name="length">Maximum characters to be returned</param> /// <returns>String</returns> public static string Chop(this string s, int length) { if (String.IsNullOrEmpty(s)) throw new ArgumentNullException(s); var words = s.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); if (words[0].Length > length) return words[0]; var sb = new StringBuilder(); foreach (var word in words) { if ((sb + word).Length > length) return string.Format("{0}...", sb.ToString().TrimEnd(' ')); sb.Append(word + " "); } return string.Format("{0}...", sb.ToString().TrimEnd(' ')); } }
In case you didn't know, an Extension method is one that appears to endow an existing type with additional methods. In this case, the type is System.String. The String type already comes with a large number of methods, together with an array of extensions methods provided by the .NET framework developers. Extension methods are static methods, which are called in the same way as instance methods although you don't instantiate an instance of the object that the method acts upon. The type that an extension method extend is denoted by the first parameter, and it's preceded by the this keyword. Here are some example of how to use this extension method:
[Razor] @myString.Chop(50)
[MVC in a Web Forms View] <%= ViewData["myString"].ToString().Chop(50) %>
[Web Forms in an ItemTemplate] <ItemTemplate> <asp:Label ID="Label1" runat="server" Text='<%# Eval("myString").ToString().Chop(50) %>' /> </ItemTemplate>
A quick explanation about the body of the method itself - as I mentioned, the first parameter is the type which is intended to be extended, and the second is the maximum number of characters to be displayed. All the words in the string that this method acts on are placed as individual items in an array by the String.Split() method. StringSplitOptions.RemoveEmptyEntries ensures that if there are double spaces, they will not be treated as words and added to the array as elements. The array is iterated over in a foreach loop, and elements are added to a StringBuilder object (together with a space after each element or word). The LINQ expression checks the current length of the StringBuilder's contents on each iteration to ensure that the maximum length specified in the parameter is not exceeded. Finally, the result has the last trailing space removed (TrimEnd()), and is returned.
Currently rated 4.73 by 11 people
Rate Now!
Date Posted:
16 May 2010 09:59
Last Updated:
07 November 2012 06:51
Posted by:
Mikesdotnetting
Total Views to date:
8444



Comments
16 May 2010 11:20 from Robert
Great extension. I added this method to my class with string extensions. Thanks
17 May 2010 16:42 from Samuel
Very nice trick.
20 May 2010 21:15 from Sinden
I've been banging my head around a way to do this and got tied up in attempting to use Regex for it and it's as simple as this!
I don't know whether to be annoyed or grateful to you!
26 September 2010 17:25 from Pham Anh
Thanks you! Sharing
27 January 2011 21:51 from Javier
Thanks Mike for sharing this code. I added a little 'tidbit' that makes the dots appear ONLY if the string is indeed truncated. Say I have two strings, one is 25 characters and the other 50. My "Chop" is set at 40, so in the case of the 25 character string I don't want to see the dots, but in the 50 character string I do.
I had trouble posting the code here (for good reason, I don't think this form allows markup), so I've posted it as a follow-up to a post at the ASP.NET forums. Follow this link: http://forums.asp.net/t/1646631.aspx
Hope that helps someone out there.
Thanks again Mike for this great resource and all your code samples.
23 March 2011 11:55 from Anooj
Shouldn't it be
if ((sb + word).Length > length)
instead of
if ((sb + word).Length + word.Length > length)
to get the desired result.
Anyways,it's a nice piece of code....
24 March 2011 20:14 from Mikesdotnetting
@Anooj
You are right, of course. The original version I posted appended word to the StringBuilder before the length was tested. I didn't update the length test at that time. I have now. Thanks.
16 June 2011 12:13 from somasekhar akiri
thanks mike nice article and nice extension method
14 August 2012 18:16 from Tara
Thanks for this - just what I needed!
14 October 2012 16:10 from Jay Tsultim
How would I include this in a cshtml file aka razor
14 October 2012 17:25 from Mikesdotnetting
@Jay,
Copy the code into a C# class files (ends with .cs) and save it in an App_Code folder.
19 November 2012 10:50 from Cat
I'm using vb .net. I copied your code into a new class and it works great if I call it with a button from a datalist but when I append <%# Eval("myString").ToString().Chop(50) %> into my html, I get an error 'Chop' is not a member of 'String'. Am I missing something obvious? Ideally, I want the truncation to execute on initialisation of the datalist so that when the user clicks a "More Details" button, I can display the full record. Any advice you can give would be greatly appreciated.