高效率的C#截取指定長度字符串,大於指定長度的,在末尾顯示指定字符,默認爲"..."

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

相關文章
相關標籤/搜索