VBScript:格式化字符串的最简单方法是什么?

VBScript:格式化字符串的最简单方法是什么?,vbscript,formatting,string-formatting,Vbscript,Formatting,String Formatting,我有以下格式: Value1为{0},Value2为{1} 我需要用字符串替换括号中的数字。在大多数语言中,使用string.Format或类似的方法很容易做到这一点。如何仅使用vbscript执行此操作 我试过: Replace (strFormat, "{0}", value1) Replace (strFormat, "{1}", value2) 它不起作用。有什么解决办法吗?为什么没有?此代码在此处工作: value1 = "1" value2 = "2" strFormat =

我有以下格式: Value1为{0},Value2为{1}

我需要用字符串替换括号中的数字。在大多数语言中,使用string.Format或类似的方法很容易做到这一点。如何仅使用vbscript执行此操作

我试过:

Replace (strFormat, "{0}", value1)  
Replace (strFormat, "{1}", value2)

它不起作用。有什么解决办法吗?

为什么没有?此代码在此处工作:

value1 = "1"
value2 = "2"

strFormat = "Value1 is {0} and Value2 is {1}."
strFormat = Replace (strFormat, "{0}", value1)  
strFormat = Replace (strFormat, "{1}", value2)

MsgBox strFormat
注意:每次替换时,我都会更新我的
strFormat

如果需要更灵活的实现,可以使用正则表达式,但现在似乎不需要

Replace(strFormat,{0},value1)

根据你的代码剪报,我猜你认为Replace直接变异了strFormat。它不是那样工作的;将结果指定给原始变量,如下所示:

strFormat = Replace (strFormat, "{0}", value1)
strFormat2 = Replace (strFormat, "{0}", value1)
您还可以指定另一个变量来存储更改的结果,如下所示:

strFormat = Replace (strFormat, "{0}", value1)
strFormat2 = Replace (strFormat, "{0}", value1)

这里有一个很好的小函数,它的工作原理类似于.NETString.Format函数。我这么做很快,所以添加错误处理取决于您。我在VB6中这样做,并添加了对Microsoft VBScript正则表达式5.5的引用

Public Function StringFormat(ByVal SourceString As String, ParamArray Arguments() As Variant) As String
   Dim objRegEx As RegExp  ' regular expression object
   Dim objMatch As Match   ' regular expression match object
   Dim strReturn As String ' the string that will be returned

   Set objRegEx = New RegExp
   objRegEx.Global = True
   objRegEx.Pattern = "(\{)(\d)(\})"

   strReturn = SourceString
   For Each objMatch In objRegEx.Execute(SourceString)
      strReturn = Replace(strReturn, objMatch.Value, Arguments(CInt(objMatch.SubMatches(1))))
   Next objMatch

   StringFormat = strReturn

End Function
例如:

StringFormat(“你好{0}。我想让你认识一下{1}。他们都为{2}工作。{0}已经为{2}工作了15年。”、“布鲁斯”、“克里斯”、“凯尔”)

返回:


你好,布鲁斯。我想让你见见克里斯。他们都为凯尔工作。Bruce为Kyle工作了15年。

我想要类似的东西,但不喜欢这些答案,因为它们意味着每个值有多行(忽略Beaner的答案是错误的语言!),因此我创建了以下内容:

Public Function StrFormat(FormatString, Arguments())
    Dim Value, CurArgNum

    StrFormat = FormatString

    CurArgNum = 0
    For Each Value In Arguments
        StrFormat = Replace(StrFormat, "{" & CurArgNum & "}", Value)
        CurArgNum = CurArgNum + 1
    Next
End Function
然后可以使用以下命令(注意,需要在变量周围添加“Array()”):

将输出您期望的内容:

Test '1', 'three', '2' and 1 again!
Test '4', 'six', '5' and 4 again!

希望这对其他语言的人来说更自然一些。

因为目前为止没有一个答案解决了格式问题 要将字符串插入/拼接为字符串,请执行以下操作:

这个简单的类:

Class cFormat
  Private m_oSB
  Private Sub Class_Initialize()
    Set m_oSB = CreateObject("System.Text.StringBuilder")
  End Sub ' Class_Initialize
  Public Function formatOne(sFmt, vElm)
    m_oSB.AppendFormat sFmt, vElm
    formatOne = m_oSB.ToString()
    m_oSB.Length = 0
  End Function ' formatOne
  Public Function formatArray(sFmt, aElms)
    m_oSB.AppendFormat_4 sFmt, (aElms)
    formatArray = m_oSB.ToString()
    m_oSB.Length = 0
  End Function ' formatArray
End Class ' cFormat
通过COM实现VBScript的.NET格式。现在您可以执行以下操作:

-------- Interpolation
Use    |Value1 is {0} and Value2 is {1}.|
to get |Value1 is zero and Value2 is one.|
from   |zero one|

Use    |{0} x 2 => {0}{0}|
to get |once x 2 => onceonce|
from   |once|

-------- Cherrypicking
Use    |{6,4}: [{0}, {2}, {4}]|
to get |even: [0, 2, 4]|
from   |0 1 2 3 4 5 even odd|

Use    |{7,4}: [{5}, {3}, {1}]|
to get | odd: [5, 3, 1]|
from   |0 1 2 3 4 5 even odd|

-------- Conversions
Use    ||{0:D}| |{0:X}| |{0:N3}| |{0:P2}| (german locale!)|
to get ||123| |7B| |123,000| |12.300,00%| (german locale!)|
from   |123|

Use    ||{0}| |{0:U}| |{0:u}||
to get ||29.06.2012 14:50:30| |Freitag, 29. Juni 2012 12:50:30| |2012-06-29 14:50:30Z||
from   |29.06.2012 14:50:30|

Use    ||{0}| |{0:E1}| |{0:N1}| |{0:N2}| |{0:N3}||
to get ||1234,56| |1,2E+003| |1.234,6| |1.234,56| |1.234,560||
from   |1234,56|

-------- Alignment
Use    ||{0,1:D}| |{0,2:D}| |{0,-2:D}| |{0,5:D}| |{0,-5:D}||
to get ||12| |12| |12| |   12| |12   ||
from   |12|
如果您对测试/演示脚本感兴趣,可以做一些实验 你自己的:

Option Explicit

' Class cFormat ...

Dim oFormat : Set oFormat = New cFormat
Dim aTests  : aTests      = Array( _
    Array("Interpolation" _
      , Array( _
            Array(True,  "Value1 is {0} and Value2 is {1}.", Array("zero", "one")) _
          , Array(False, "{0} x 2 => {0}{0}"               , "once"              ) _
        } _
    ) _
  , Array("Cherrypicking" _
      , Array( _
            Array(True , "{6,4}: [{0}, {2}, {4}]", Array(0, 1, 2, 3, 4, 5, "even", "odd")) _
          , Array(True , "{7,4}: [{5}, {3}, {1}]", Array(0, 1, 2, 3, 4, 5, "even", "odd")) _
        } _
    ) _
  , Array("Conversions" _
      , Array( _
            Array(False, "|{0:D}| |{0:X}| |{0:N3}| |{0:P2}| (german locale!)", 123      ) _
          , Array(False, "|{0}| |{0:U}| |{0:u}|"                             , Now     ) _
          , Array(False, "|{0}| |{0:E1}| |{0:N1}| |{0:N2}| |{0:N3}|"         , 1234.56 ) _
        } _
    ) _
  , Array("Alignment" _
      , Array( _
            Array(False, "|{0,1:D}| |{0,2:D}| |{0,-2:D}| |{0,5:D}| |{0,-5:D}|", 12 ) _
        } _
    ) _
)
Dim sFormat : sFormat = "Use    |{0}|{3}to get |{1}|{3}from   |{2}|{3}"
Dim aData   : aData   = Array(0, 1, 2, vbCrLf)
Dim aTest
For Each aTest In aTests
    WScript.Echo "--------", aTest(0)
    Dim aSample
    For Each aSample In aTest(1)
        aData(0) = aSample(1)
        If aSample(0) Then
           aData(1) = oFormat.formatArray(aSample(1), aSample(2))
           aData(2) = Join(aSample(2))
        Else
           aData(1) = oFormat.formatOne(  aSample(1), aSample(2))
           aData(2) = aSample(2)
        End If
        WScript.Echo oFormat.formatArray(sFormat, aData)
    Next
    WScript.Echo
Next
要了解.NET中的格式设置,请从和开始


请参阅和,以获取将此类类包含(而不是复制和粘贴)到脚本中的想法。

Hehe,谢谢。它总是简单的。他不需要另一个变量,只需要更新原始字符串。可能会对VBScript进行一些调整,但该函数看起来可能比简单的替换函数更通用。这是最好的答案;简单且可重复使用。我差一点投了赞成票,但后来我遇到了麻烦。问题是,您的示例修改了
SourceString
。如果
SourceString
包含您将要重用的格式字符串,则这是不好的。对
StringFormat(SourceString,…)
的后续调用将不起作用,因为
SourceString
包含上一次调用的结果。我将编辑您的答案以修复此问题。已编辑。我将参数
SourceString
的名称更改为
FormatString
。例如,第一个参数的名称为
format
。现在,我可以投票了!我看到这个解决方案唯一可能的问题是,包含后面参数编号格式的参数将被替换。