水如烟

                 顺其自然,水到渠成 LzmTW

文或代码皆是面向初学者.我是爱好者,也是初学者.那些"文章",只按自己理解写,我是不知术语名词的.所以只供参考,也仅供参考.

导航

中英文数字混合的复合格式处理

Posted on 2006-06-10 21:22  水如烟(LzmTW)  阅读(620)  评论(0编辑  收藏  举报
Author:水如烟

曾写过一个How TO:操作字长字符串,现在重新整理,使更方便些.
Public Class uString

    
Private Sub New()
    
End Sub

    
Private Shared gEncoding As System.Text.Encoding = System.Text.Encoding.GetEncoding("GB2312")

    
Public Shared Property Encoding() As System.Text.Encoding
        
Get
            
Return gEncoding
        
End Get
        
Set(ByVal value As System.Text.Encoding)
            gEncoding 
= value
        
End Set
    
End Property

    
Public Shared Function Length(ByVal s As StringAs Integer
        
Return gEncoding.GetByteCount(s)
    
End Function

    
Public Shared Function PadLeft(ByVal s As StringByVal totalWidth As IntegerByVal paddingChar As CharAs String
        
Return s.PadLeft(GetValidNum(totalWidth + s.Length - Length(s)), paddingChar)
    
End Function

    
Public Shared Function PadLeft(ByVal s As StringByVal totalWidth As IntegerAs String

        
Return s.PadLeft(GetValidNum(totalWidth + s.Length - Length(s)))
    
End Function

    
Public Shared Function PadRight(ByVal s As StringByVal totalWidth As IntegerByVal paddingChar As CharAs String
        
Return s.PadRight(GetValidNum(totalWidth + s.Length - Length(s)), paddingChar)
    
End Function

    
Public Shared Function PadRight(ByVal s As StringByVal totalWidth As IntegerAs String
        
Return s.PadRight(GetValidNum(totalWidth + s.Length - Length(s)))
    
End Function

    
Public Shared Function SubString(ByVal Line As StringByVal Index As IntegerByVal Len As IntegerAs String
        
Dim num As Integer = Length(Line)
        
Return gEncoding.GetString(gEncoding.GetBytes(Line), Index, Len)
    
End Function

    
Private Shared Function GetValidNum(ByVal num As IntegerAs Integer
        
If num < 0 Then
            
Return 0
        
Else
            
Return num
        
End If
    
End Function

    
Public Shared Function Format(ByVal sformat As StringByVal arg0 As ObjectAs String
        
Return Format(sformat, New Object() {arg0})
    
End Function

    
Public Shared Function Format(ByVal sformat As StringByVal arg0 As ObjectByVal arg1 As ObjectAs String
        
Return Format(sformat, New Object() {arg0, arg1})
    
End Function

    
Public Shared Function Format(ByVal sformat As StringByVal arg0 As ObjectByVal arg1 As ObjectByVal arg2 As ObjectAs String
        
Return Format(sformat, New Object() {arg0, arg1, arg2})
    
End Function

    
Public Shared Function Format(ByVal sformat As StringByVal args As Object()) As String
        
Return myFormat(sformat, args)
    
End Function

    
Private Shared Function myFormat(ByVal sformat As StringByVal args As Object()) As String
        
Dim mysformat As String = sformat

        
'以下匹配字符串,找的是复合格式{index[,alignment][:formatString]}有alignment的完整项{}
        Dim mPattern As String = "{(\d+)([\s]*,[\s]*[-]?)(\d+)(.*?)}"
        
Dim mMatchs As System.Text.RegularExpressions.MatchCollection
        mMatchs 
= System.Text.RegularExpressions.Regex.Matches(mysformat, mPattern)

        
'处理各匹配项,重置各项长度
        For Each m As System.Text.RegularExpressions.Match In mMatchs

            
Dim s As String = m.Groups(0).Value '匹配完整项
            Dim index As Integer = Convert.ToInt32(m.Groups(1).Value) '格式索引
            Dim len As Integer = Convert.ToInt32(m.Groups(3).Value) '原固定长度

            
Dim NowLen As Integer = AligLen(len, args(index)) '现固定长度
            '以下重置固定长度
            Dim replace As String = "{${1}${2}" & NowLen.ToString & "${4}}"
            
Dim Nows As String = m.Result(replace)
            mysformat 
= mysformat.Replace(s, Nows)
        
Next

        
Return String.Format(mysformat, args)
    
End Function

    
'混合字符文本固定长度的重置
    Private Shared Function AligLen(ByVal len As IntegerByVal arg As ObjectAs Integer
        
Return len - Length(arg.ToString) + arg.ToString.Length
    
End Function
End Class