截取字符串方法总结

 在新闻文章项目里经常会碰到在前台显示标题列表,因为前台界面都是固定好了的,所以在显示时必须限制标题显示字符数量,超过这个数字的字符将被截去,以“……”之类的代替。

    截取字符串我们一般最常用也最简单的就是用string的Substring方法,这种方法在取值时汉字字母是不区分的,而因为汉字跟字母在显示时宽度有很大区别,所以截取后相同长度字符时有字母数字跟不带字母数字的字符串显示上回有很大区别,从而影响整个排版,比如下面的字符串:繁时不可慌,闲时不可荒fsbkh,xsbkh同为相同字符数,显示时就极不对称了。

    另外一种方法就是,把字符串转化为bytes,在计算字符串的byte数时一个汉字按两个byte处理的,所以在截取字符时就避免了汉字字母显示时的不对称,以下自己写的一个标题字符串截取函数:

 

 截取字符串方法总结(图一) 截取字符串长度

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> 1截取字符串方法总结(图一)截取字符串方法总结(图二) /**/''' <summary>
 2截取字符串方法总结(图三)    ''' 截取字符串长度
 3截取字符串方法总结(图三)    ''' </summary>
 4截取字符串方法总结(图三)    ''' <param name="str">待处理的字符串</param>
 5截取字符串方法总结(图三)    ''' <param name="len">截取长度</param>
 6截取字符串方法总结(图三)    ''' <param name="strMore">超过长度部分显示字符</param>
 7截取字符串方法总结(图三)    ''' <returns>String</returns>
 8截取字符串方法总结(图四)    ''' <remarks>超过固定长度显示固定字符串替代</remarks>
 9截取字符串方法总结(图一)截取字符串方法总结(图二)    Public Function CutString()Function CutString(ByVal str As String, ByVal len As Integer, ByVal strMore As String) As String
10截取字符串方法总结(图三)        Dim sarr As Byte() = System.Text.Encoding.Default.GetBytes(str)
11截取字符串方法总结(图三)        Dim strMoreLength As Integer = System.Text.Encoding.Default.GetBytes(strMore).Length
12截取字符串方法总结(图三)        If sarr.Length > len Then
13截取字符串方法总结(图三)            Return System.Text.Encoding.Default.GetString(sarr, 0, len - strMoreLength) & strMore
14截取字符串方法总结(图三)        Else
15截取字符串方法总结(图三)            Return str
16截取字符串方法总结(图三)        End If
17截取字符串方法总结(图四)    End Function

 

    上面这个方法也很简单,但是还有个问题,就是如果我要处理的字符串是“520字符串截取”,按上面的方法,它的GetBytes.Length应该等于13,如果我要截取的长度len=10的话,那么它截取后的字符串就成了“520字符串?”因为sarr(9)即第十个byte的值其实是表示"截"字的两个byte中的一个,这样就会出现文字显示错误。

    看到另外一种方法,先用asc()得到字符的ascii码,如果asc()<0就是汉字,这时长度就算2,否子算一个字符长度,这种方法就避免了上面的截取字符串造成字符丢失的情况:

 

  1截取字符串方法总结(图一)截取字符串方法总结(图二)Public Shared Function LeftByte()Function LeftByte(ByVal Str As String, ByVal Lens As Double) As String
 2截取字符串方法总结(图三)        Dim Length
 3截取字符串方法总结(图三)        Length = 0
 4截取字符串方法总结(图三)        Dim i As Integer
 5截取字符串方法总结(图三)        For i = 1 To Len(Str)
 6截取字符串方法总结(图三)            If (Asc(Mid(Str, i, 1)) < 0) Then
 7截取字符串方法总结(图三)                Length = Length + 2
 8截取字符串方法总结(图三)            Else
 9截取字符串方法总结(图三)                Length = Length + 1
10截取字符串方法总结(图三)            End If
11截取字符串方法总结(图三)            If Length = Lens Then
12截取字符串方法总结(图三)                LeftByte = Left(Str, i)
13截取字符串方法总结(图三)                Exit Function
14截取字符串方法总结(图三)            ElseIf Length > Lens Then
15截取字符串方法总结(图三)                LeftByte = Left(Str, i - 1)
16截取字符串方法总结(图三)                Exit Function
17截取字符串方法总结(图三)            End If
18截取字符串方法总结(图三)        Next
19截取字符串方法总结(图三)        Return Str
20截取字符串方法总结(图四)    End Function

 

    综合以上一些方法,自己写了个针对处理字符串的函数:超过规定长度时即截取,省略的字符做参数添加,比如想在省略的字符处显示"……"或"……"或"——"都可以,免去了每个显示都要去重写一次方法的烦琐:

 

 1截取字符串方法总结(图一)截取字符串方法总结(图二)  /**/''' <summary>
 2截取字符串方法总结(图三)    ''' 截取字符串长度
 3截取字符串方法总结(图三)    ''' </summary>
 4截取字符串方法总结(图三)    '''<Author>TheoMi</author>
 5截取字符串方法总结(图三)    '''<date>2008-03-15</date>
 6截取字符串方法总结(图三)    ''' <param name="Str">待处理的字符串</param>
 7截取字符串方法总结(图三)    ''' <param name="Lens">截取长度</param>
 8截取字符串方法总结(图三)    ''' <param name="StrMore">超过长度部分显示字符</param>
 9截取字符串方法总结(图三)    ''' <returns>String</returns>
10截取字符串方法总结(图四)    ''' <remarks> 区分汉字数字字母的长短问题,超过固定长度显示固定字符串替代</remarks>
11截取字符串方法总结(图一)截取字符串方法总结(图二)    Public Shared Function CutStringByByte()Function CutStringByByte(ByVal Str As String, ByVal Lens As Integer, ByVal StrMore As String) As String
12截取字符串方法总结(图三)        Dim Length As Integer = 0
13截取字符串方法总结(图三)        Dim strBytesLength As Integer = System.Text.Encoding.Default.GetBytes(Str).Length
14截取字符串方法总结(图三)        Dim MoreLength As Integer = System.Text.Encoding.Default.GetBytes(StrMore).Length
15截取字符串方法总结(图三)        Dim i As Integer
16截取字符串方法总结(图三)        If strBytesLength > Lens Then
17截取字符串方法总结(图三)            For i = 1 To Len(Str)
18截取字符串方法总结(图三)                If (Asc(Mid(Str, i, 1)) < 0) Then
19截取字符串方法总结(图三)                    Length = Length + 2
20截取字符串方法总结(图三)                Else
21截取字符串方法总结(图三)                    Length = Length + 1
22截取字符串方法总结(图三)                End If
23截取字符串方法总结(图三)                If Length = Lens - MoreLength Then
24截取字符串方法总结(图三)                    CutStringByByte = Left(Str, i) & StrMore
25截取字符串方法总结(图三)                    Exit Function
26截取字符串方法总结(图三)                ElseIf Length > Lens - MoreLength Then
27截取字符串方法总结(图三)                    CutStringByByte = Left(Str, i - 1) & StrMore
28截取字符串方法总结(图三)                    Exit Function
29截取字符串方法总结(图三)                End If
30截取字符串方法总结(图三)            Next
31截取字符串方法总结(图三)        Else
32截取字符串方法总结(图三)            For i = 1 To Len(Str)
33截取字符串方法总结(图三)                If (Asc(Mid(Str, i, 1)) < 0) Then
34截取字符串方法总结(图三)                    Length = Length + 2
35截取字符串方法总结(图三)                Else
36截取字符串方法总结(图三)                    Length = Length + 1
37截取字符串方法总结(图三)                End If
38截取字符串方法总结(图三)                If Length = Lens Then
39截取字符串方法总结(图三)                    CutStringByByte = Left(Str, i)
40截取字符串方法总结(图三)                    Exit Function
41截取字符串方法总结(图三)                ElseIf Length > Lens Then
42截取字符串方法总结(图三)                    CutStringByByte = Left(Str, i - 1)
43截取字符串方法总结(图三)                    Exit Function
44截取字符串方法总结(图三)                End If
45截取字符串方法总结(图三)            Next
46截取字符串方法总结(图三)        End If
47截取字符串方法总结(图三)        Return Str
48截取字符串方法总结(图四)    End Function

 

posted @ 2010-11-01 13:29  微疯子  阅读(570)  评论(0编辑  收藏  举报
我要啦网店统计