高效率的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;
        }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值