頁面上很多顯示新聞列表時,考慮面子問題,常常需要限制標題長度。
以前都是用
<%#Eval("title").ToString().Length > 10 ? Eval("title").ToString ().Substring(0, 8) + "..." : Eval("title").ToString()%>
這樣的方式實現,這樣代碼即繁多又不能重用,不過這個還不是問題,因為可以在後台寫個傳字符串 和指定長度的方法來簡化。
問題是很多情況下要截取的字符串裡即有漢字也有字母數字標點符號甚至是空格等。
如此以來就會出現這樣的情況
博客園萬歲萬歲萬萬歲
博客園成立於20...
12345678...
而實際上,下面兩條數據可能是“博客園成立於2004年”“12345678910111213”雖然超過了10個字符 ,但是長度足以全部顯示。
博客園萬歲萬歲萬萬歲
博客園成立於2004年
12345678910111213
這時候就需要考慮字符本身是全角還是半角。我終於忍不住這個問題,自己寫了個可以精確截取長度 的方法,雖然沒什麼技術含量,但是很實用,這是屬於細節問題,不是技術問題。
此方法按照全角長度截取,如“博客園成立於2004年”有11個字符,但有4個數字,屬於半角,兩個半 角等於一個全角,所以此字符串相當於9個漢字。可以全部顯示,為了盡可能滿足樣式,有奇數個半角字 符並且影響到截取時,會截取x.5個全角。如“博客園萬歲萬歲萬萬s歲”則會截取為“博客園萬歲萬歲萬 萬s”,如果“博客園萬歲萬歲萬萬sui”,則“博客園萬歲萬歲萬萬su”。
截取字符串(按全角長度,一個全角等於兩個半角)
/// <summary>
/// 截取字符串(按全角長度,一個全角等於兩個半角)
/// </summary>
/// <param name="str">字符串</param>
/// <param name="length">截取長度(全角)</param>
/// <param name="length1">此處填0</param>
/// <returns></returns>
public String InterceptString(String str, Int32 length, Int32 length1)
{
str = ClearBlank(str);
//System.Text.RegularExpressions.Regex.Replace(str, "");
if (str.Length > length)
{
if (length1 == 0)
{
length1 = length;
}
if (str.Length >= length1)
{
String str_left = str.Substring(0, length1);
String str_right = str.Remove(0, length1);
int banjiao = 0, other = 0;
char[] chars = str_left.Trim().ToCharArray ();
foreach (char ch in chars)
{
if (ch >= 33 && ch <= 126)
{
banjiao++;
}
else// if(ch>=65281 && ch<=65374)
{
other++;
}
}
if ((other + (float)banjiao / 2) > length || (other + (float)banjiao / 2) - length == 0.5)
{
str_left = str_left.Remove (str_left.Length - 1, 1);
return str_left;
}
else if ((other + (float)banjiao / 2) - length != 0)
{
if (length1 + 1 <= str.Length)
{
str_left = InterceptString(str, length, length1 + 1);
}
}
return str_left;
}
else
{
return str;
}
}
else
{
return str;
}
}
/// <summary>
/// 去掉字符串中所有空格
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public String ClearBlank(String str)
{
CharEnumerator myenum = str.GetEnumerator();
str = String.Empty;
while (myenum.MoveNext())
{
byte[] array = new byte[1];
array = System.Text.Encoding.ASCII.GetBytes (myenum.Current.ToString());
int asciiCode = (short)(array[0]);
if (asciiCode != 32)
{
str += myenum.Current.ToString();
}
}
return str;
}