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自定义函数StringFormat (仿.NET String.Format 方法)的更多相关文章
- php示例代码之类似于C#中的String.Format方法
php示例代码之类似于C#中的String.Format方法 原文来自于 http://stackoverflow.com/questions/1241177/c-string-format-equ ...
- 避免string.Format方法的装箱
我们知道,使用string.Format方法可能会存在装箱的情况.比如如下: static void Main(string[] args) { string s = string.Format(&q ...
- 通过Oracle函数SQL实现C# String.Format字符串格式化功能
语言国际化要求,开发上要求Oracle数据库SQL中对应的返回信息-Message,实现一个通用函数调用,比如:提示信息内容:条码123456当前工站在FCT!”,即通用的信息内容格式化标准为:“条码 ...
- JAVA String.format 方法使用介绍
1.对整数进行格式化:%[index$][标识][最小宽度]转换方式 我们可以看到,格式化字符串由4部分组成,其中%[index$]的含义我们上面已经讲过,[最小宽度]的含义也很好理解, ...
- JAVA String.format 方法使用介绍<转>
在JDK1.5中,String类增加了一个非常有用的静态函数format(String format, Objece... argues),可以将各类数据格式化为字符串并输出.其中format参数 ...
- Javascript中的String.format方法实现
<script type='text/javascript'> String.format = function() { var s = arguments[0]; for (var i ...
- Java String.Format() 方法及参数说明
转自:https://blueram.iteye.com/blog/441683 JDK1.5中,String类新增了一个很有用的静态方法String.format():format(Locale l ...
- 如何在string.Format()方法中输出大括号
在string.Format参数中,大括号{}是有特殊意义的符号,但是如果我们希望最终的结果中包含大括号({}),那么我们需要怎么做呢?是”\{”吗?很遗憾,运行时,会给你一个Exception的!正 ...
- Java中利用MessageFormat对象实现类似C# string.Format方法格式化
我们在写C#代码的时候常常会使用到string.Format("待格式化字符串{0},{1},....",参数1,参数2,...),来格式化字符串,特别是拼接字符的时候,这种方式使 ...
随机推荐
- mount不是很熟悉 转载文章了解下 转自http://forum.ubuntu.org.cn/viewtopic.php?f=120&t=257333
纯粹针对刚刚解封开包的新新手,老鸟们请自觉绕行,否则浪费你的时间你非要逼我做谋杀犯可不光我的事你还没地方说理去.如果你正好是个崭新的新手,就耐心的花点时间看看吧,至少大概看看,不要在一个陌生又黑暗的到 ...
- java数据传递例子+内存分析
一.引用传递 1.例子1 package com.jikexueyuan.ref; class Ref1{ int temp = 10; } public class RefDemo01 { publ ...
- 【解决】SQL Server作业中Excel Application不能访问文件
在通过SQL Server作业来实现定时任务时,出现如下错误: FullyQualifiedErrorId : ComMethodTargetInvocation使用“1”个参数调用“Add”时发生异 ...
- 使用delphi+intraweb进行微信开发1~4代码示例
前几讲重点阐述的是使用iw进行微信开发的技术难点及解决方法,提供的都是代码片段(微信消息加解密是完整代码),实际上我始终感觉按照教程实作是掌握一门技术的最重要的方法!不过对于刚刚接触这类开发的朋友来说 ...
- 【HEVC】1、HM-16.7编码器的基本结构
编码器在整个HM解决方案中的工程名为TAppEncoder,入口点函数位于encmain.cpp文件中: int main(int argc, char* argv[]) { TAppEncTop c ...
- 嵌套 QQ、微博 通讯工具到HTML中
自己QQ.微博的实例: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Defa ...
- 学习的目的:理解<转>
http://www.hkuspacechina.com/chs/news-and-events/news/detail/news-first-day-of-school-2015-04-23 学习的 ...
- OpenWrt自定义和官方一样的固件
我用的OpenWrt版本是Barrier Breaker 14.07,硬件是NetGear WNDR4300. 我自定义固件的目的是把固件的根分区扩到最大(100MB,总FLASH是128MB),试过 ...
- linux中的进程和线程
应用程序:可以被操作系统执行的一组指令和参数的集合,是静态的,并存储在磁盘空间中: 进程:在操作系统中在运行程序后,处于运行状态的程序,是应用程序的一个执行过程,同时也是操作系统分配内存,cpu等系统 ...
- border:none;与border:0;的区别
border:none表示边框样式无,border:0表示边框宽度为0;当定义了border:none,即隐藏了边框的显示,实际就是边框宽度为0. 当定义边框时,必须定义边框的显示样式.因为边框默认样 ...