前后台实现精确截取指定长度字符串(考虑全角半角)

页面上很多显示新闻列表时,考虑面子问题,常常需要限制标题长度。

以前都是用

<%#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;
         }

时间: 2025-01-17 06:30:07

前后台实现精确截取指定长度字符串(考虑全角半角)的相关文章

jQuery截取指定长度字符串的实现原理及代码_jquery

截取指定长度字符串操作在网站建设中大量使用,尤其是在新闻列表这种类型的操作中大量应用. 下面就是一个截取字符串代码实例: <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="author" content="htt

jQuery截取指定长度字符串代码_jquery

例子,截取字符串代码. <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>jQuery截取字符串操作---www.jb51.net</title> <script type="text/javascript"

JavaScript截取指定长度字符串点击可以展开全部代码_javascript技巧

文章的篇幅往往不是那么恰到好处,如果以原有的篇幅展示,那么有可能会影响网页的布局或者美观度,这个时候就要根据情况适量截取一定的字符串,以适应布局,不过当点击一个按钮的时候依然可以展开全部的内容,下面就通过一个实例详细介绍一下如何实现此效果,代码示例如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" conten

用overflow代替left截取指定长度字符串

为了防止文章标题过长超过容器(td,div)宽度而显示成多行,我们通常要对标题进行处理让其显示在一行,通常使用的方法有两种:一种方法是在客户端用CSS设置容器的overflow属性:另一种方法则是在服务器端用left函数对标题字符串进行截取.两种方法通常情况下都能达到我们的目的: <style type="text/css"> div{ width:200px; overflow:hidden; } </style> <div>轻轻松松在页面中插入单

解决方案-截取指定长度的富文本内容可能会出现页面被凌乱的问题

问题描述 截取指定长度的富文本内容可能会出现页面被凌乱的问题 5C freemaker页面中截取指定长度的字符串,超出长度的部分用-替代 <#if topic.title?length lt 35> ${topic.title}<#else> ${topic.title?substring(035)}... </#if> 如果数据库中topic.title的内容不是纯文本,而是富文本(含有很多html标签的文本)内容,按指定 长度截取的话,就有可能会破坏富文本的html

js substring从右边获取指定长度字符串

 本篇文章主要是对js substring从右边获取指定长度字符串的示例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 如下所示: 代码如下:  /*       Get the rightmost substring, of the specified length,       from a String object.    */     String.prototype.right = function (length_)     {             var _fr

截取指定长度的文字(包含对汉字的处理)

一般来说,要截取的变量来自Mysql,首先要保证那个字段长度要足够长,一般为char(200),可以保持100个汉字,包括标点. 本程序实现的功能:截取指定长度汉字而不会出现以"?>"结尾,超出部分以"..."代替 <?PHP $str="这个字符比较长SO LONG"; $Short_Str=showShort($str,4);//截取前面4个汉字,结果为:这个字符... Echo "$Short_Str"; F

又一个字符串,由全角字符,半角字符构成,如何截取该字符串,全角算两个字符

问题描述 又一个字符串,由全角字符,半角字符构成,如何截取该字符串,全角算两个字符 解决方案 解决方案二:看看这个是你要的吗?///<summary>///取中文字串///</summary>///<paramname="content">内容</param>///<paramname="length">长度</param>///<returns></returns>pr

安全的截取指定长度的html或者ubb字符串

在将html代码输出到页面时,有时候会需要截断字符串保留指定长度的字符串,由于html中有些标签 必须成对出现,所以在截取html时需要特别注意,不能因为截断问题把页面搞乱掉. 在截取字符串时需要记录每一个标签是否关闭,如果截取到指定长度还有没有关闭的标签,那么我们 需要将标签关闭,或者删除掉未关闭的标签.不考虑某些不需要关闭标签的情况,html开始和结束标签总 是成对出现的,我们可以遍历输入的字符串,并在标签开始时放入堆栈中,遇到结束标签时从堆栈中弹出 一个元素,这样遍历到指定长度,堆栈中留下