C#中字符串截斷本沒有那麼麻煩,問題就出在string.Substring()這個方法將中文也按一個字符計算,致使咱們在實際應用中截取字符串(中英文組合)後的「長度」不一致。正則表達式
國際慣例,在網上搜索了一下,大體獲得了兩中截斷算法:
1. 從起始位置取得字符 -> 逐一用正則表達式匹配 -> 拼接成最終字符串。(這是廣爲流傳的方法,也是效率最低的方法。)
2. 從起始位置取得字符 -> 逐一用ASCII比較 -> 再拼接成最終字符串。算法
相比之下,算法2比算法1高明,畢竟ASCII比較比正則表達式的執行效率更高。但最終,我仍然沒有使用算法2,而是進行了進一步的優化:優化
/// <summary> /// 高效率的C#截取指定長度字符串,大於指定長度的,在末尾顯示指定字符,默認爲"..." /// 備註:C#中字符串截斷本沒有那麼麻煩,問題就出在string.Substring()這個方法將中文也按一個字符計算,致使咱們在實際應用中截取字符串(中英文組合)後的「長度」不一致。 /// </summary> /// <param name="str"></param> /// <param name="len"></param> /// <param name="endShow"></param> /// <returns></returns> public static string CutStr(string str, int len, string endShow = "...") { if (!string.IsNullOrWhiteSpace(str)) { int strLen = str.Length; #region 計算長度 int tempCutLen = 0; while (tempCutLen < len && tempCutLen < strLen) { //每遇到一箇中文,則將目標長度減一。 if ((int)str[tempCutLen] > 128) { len--; } tempCutLen++; } #endregion if (tempCutLen < strLen && tempCutLen > 0) { str = string.Format("{0}{1}", str.Substring(0, tempCutLen), endShow); } } return str; }
版權聲明:本文爲博主原創文章,未經博主容許不得轉載。code