• VFP自定义函数StringFormat (仿.NET String.Format 方法)


    VFP仿.NET String.Format 方法

    将指定字符串中的每个{x}替换为相应值,并返回文本

    *-- 调用格式 StringFormat("日期{2},字符{1}","TAB",{^2013-01-01})
    Function StringFormat
    Parameters cText,Parameter1,Parameter2,Parameter3,Parameter4,Parameter5,Parameter6,Parameter7,Parameter8,Parameter9,Parameter10

    Local _tokens As Collection,cEndText As String,nCount As Integer,cName As String,oTokenParser As Object
    Local oPara As Collection
    cEndText=""
    If Vartype(cText) <>"C"
     Return .T.
    Endif
    *--创建集合
    oPara=Createobject("Collection")
    For nCount=1 To 10
     cName ="Parameter"+Alltrim(Str(nCount))
     oPara.Add(&cName)
    Endfor

    oTokenParser =Createobject("TokenParser")
    oTokenParser .ParseTemplate(cText)
    nCount=1
    For Each token In oTokenParser ._tokens
     If Like("{*}",token)
    *--判断{}是否符合要求
      cTmp=Substr(token,2,Len(token)-2)
      If Isdigit(cTmp)  And Val(cTmp)<=10
       cVal=oPara.Item(Val(cTmp))
       Do Case
       Case Vartype(cVal)=="C"
        cEndText = cEndText  +cVal
       Case Vartype(cVal)=="L"
        cEndText = cEndText +Iif(cVal==.T.,".T.",".F.")
       Case Vartype(cVal )=="N"
        cEndText = cEndText +Alltrim(Str(cVal))
       Case Vartype(cVal)=="D"
        cEndText = cEndText +"{^" +Dtoc(cVal)+"}"
       Case Vartype(cVal)=="T"
        cEndText = cEndText +"{^" +Ttoc(cVal)+"}"
       Endcase
       nCount = nCount + 1
      Endif
     Else
      cEndText = cEndText + token
     Endif
    Endfor
    Return cEndText
    Endfunc

    #Define LABEL_OPEN_CHAR = '{'
    #Define LABEL_CLOSE_CHAR = '}'
    Define Class  TokenParser As Custom
     _tokens=.F.
     _temp=""
     _currentMode=.F.
     _lastMode=.F.
     Procedure Init
     Local tty As Collection
     tty=Createobject("collection")
     This._tokens=tty
     Endproc

     Procedure EnterMode
     Lparameters mode
    *-- 当状态改变的时候应当保存之前已处理的寄存器中的内容
     If Len(This._temp) > 0
      This._tokens.Add(This._temp)
      This._temp=""
     Endif
     This._lastMode =This._currentMode
     This._currentMode = mode
     Endproc

     Procedure LeaveMode
     If Len(This._temp)> 0
      This._tokens.Add(This._temp)
      This._temp=""
     Endif
    *--因为只有两个状态,因此
     This._currentMode = This._lastMode
     Endproc
     Procedure ParseTemplate
     Lparameters template
     For i=1 To Len(template)
      c=Substr(template,i,1)
      Do Case
      Case c=LABEL_OPEN_CHAR
       This.EnterMode(1)
    &&将当前字符压入寄存器,同样的代码在三个分支都出现了
    && 请留意这行代码出现的时机
    &&在不同的状态下可能出现不同的处理过程
       This._temp = This._temp + c
      Case c=LABEL_CLOSE_CHAR
    && 将当前字符压入寄存器
       This._temp = This._temp + c
    && 因为本例只有两个状态,因此这里相当于:_EnterMode(ParserMode.LeaveLabel)
    && 但是为了区别一下,我还是定义了两个方法来实现
       This.LeaveMode()
      Otherwise
       This._temp = This._temp + c
      Endcase
     Endfor
     Endproc
    Enddefine

    VFP祺佑三层开发框架,是VFP界第一款可以应用于开发CS、BS、APP、小程序、公众号的全功能开发框架。了解更多,请访问http://www.sn58.cn
  • 相关阅读:
    python模块—socket
    mac os系统的快捷键
    教你如何将UIImageView视图中的图片变成圆角
    关于ASP.NET MVC
    iOS 日期格式的转换
    将App通过XCode上传到AppStore 出现这个错误“An error occurred uploading to the iTunes Store”的解决方法
    关于MAC OS下面两个软件的功能改进——Dictionary和Fit 输入法
    分享一下上个星期的香港行程
    【博客园IT新闻】博客园IT新闻 iPhone 客户端发布
    解决Entity Framework Code First 的问题——Model compatibility cannot be checked because the database does not contain model metadata
  • 原文地址:https://www.cnblogs.com/fitche/p/3552123.html
Copyright © 2020-2023  润新知