zoukankan      html  css  js  c++  java
  • 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使用QRCode模块生成二维码
    C++ STL中允许重复key的multimap
    C++ STL中Map的按Value排序
    C++ STL中Map的按Key排序
    C++ String和其他类型互换
    android studio
    加快android studio 编译速度(已更新至Android Studio 3.3.1)
    解决Installation failed with message Failed to finalize session : INSTALL_FAILED_INVALID_APK的问题
    Android 自定义Dialog 去除阴影
    FFmpeg(14)-使用NDK、C++完成EGL,display, surface, context的配置和初始化
  • 原文地址:https://www.cnblogs.com/fitche/p/3552123.html
Copyright © 2011-2022 走看看