Cắt n ký tự đầu tiên của một chuỗi với C#

Ngày đăng: 14/07/2011 Lượt xem:210 Share:
Hiển thị n ký tự đầu tiên của chuỗi mà không cắt từ nửa chừng của một từ nào là một yêu cầu phổ biến, nhưng nếu đúng ký tự thứ n lại là ký tự nằm giữa 1 từ nào đó thì sao?. Bài viết này minh họa cho bạn cách giải quyết vấn đề này.

Khi lướt web nếu để ý bạn sẽ thấy một số trang hoặc diễn đàn có tiêu đề bài viết quá dài và họ không muốn trình bày tiêu đề bài đó thành nhiều hơn 1 dòng, và tiêu đề bài đó được cắt n ký tự đầu (giả sử 200) nhưng nếu đúng ký tự thứ 200 lại là ký tự nằm giữa 1 từ nào đó, như vậy nếu không giải quyết vấn đề thì số ký tự ta cắt sẽ có từ cuỗi không có ý nghĩa. Bạn tham khảo code sau đây để áp dụng:

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Text;
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string str1 = @"Với tinh thần chia sẻ, giao lưu và học hỏi với các
bạn tôi lập website hmweb
Chia sẻ là niềm vui. Chia sẻ những gì có thể cũng là
một phần trong những sở thích của tôi.
Tôi hy vọng qua hmweb bạn có thể tìm kiếm
được những thông tin hữu ích cho các bạn";
string str2 = str1.CatChuoi(30);
}
}
public static class StringExtensions
{
/// <summary>
/// Trả về phần đầu của chuỗi và đảm bảo đủ từ
/// </summary>
/// <param name="s"></param>
/// <param name="length">Số ký tự tối đa được cắt</param>
/// <returns>String</returns>
public static string CatChuoi(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)
throw new ArgumentException("Từ đầu tiên dài hơn chuỗi cần cắt");
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(' '));
}
}
Giải thích qua về phương pháp trên ta thấy có 2 tham số đầu vào là chuỗi đầu vào s và length là số ký tự tối ta ta sẽ cắt (Tối đa nghĩa là nếu ký tự thứ length là khoảng trắng thí chuỗi cắt được có độ dài là length ngược lại sẽ lấy đến khoảng trắng cuối cũng trước length ). Chúng ta sử dụng String.Split để chia chuỗi ra mảng phân cách bởi khoảng trắng sau đó ta dùng vòng lặp (foreach) để xử lý chuỗi
 
Thêm một thuật toán nữa cho các bạn tham khảo

Mã:
public static string SubString(string inputString, int length)
        {
            try
            {
                //Nếu chuỗi nhỏ hơn chiều dài cần cắt thì return về chính chuỗi truyền vào
                if (inputString.Length <= length)
                    return inputString;


                string strResult = string.Empty;
                int iEmptyIndex = 0;


                //Nếu chỉ có 1 từ --> ko cho cắt (vô nghĩa)
                iEmptyIndex = inputString.IndexOf(" ");
                if (iEmptyIndex != -1)
                {
                    //Cắt chuỗi yêu cầu
                    strResult = inputString.Substring(0, length);


                    //Tìm index của khoảng trắng kế bên chuổi cắt. Nếu là khoảng trắng --> return kết quả là strSplited.
                    //Ngược lại: cắt chuổi ký tự thừa của strSplited
                    iEmptyIndex = inputString.IndexOf(" ", length);
                    if (iEmptyIndex == length)
                        return strResult;
                    else
                    {
                        //strResult: Cộng hò --> Cộng
                        iEmptyIndex = strResult.LastIndexOf(" ");
                        if (iEmptyIndex != -1)
                        {
                            strResult = strResult.Substring(0, iEmptyIndex);
                        }
                    }
                }
                return strResult;
            }
            catch { return null; }
        }
 

Thống kê

Chủ đề
100,657
Bài viết
467,427
Thành viên
339,832
Thành viên mới nhất
tiendungmobi
Top