我有以下格式: 值1是{0},值2是{1}。VBScript:格式化字符串的最简单方法是什么?
我需要用括号替换括号中的数字。这很容易在大多数语言中使用string.Format或沿着这些行的东西来完成。我怎样才能做到这一点只使用VBScript?
我已经试过:
Replace (strFormat, "{0}", value1)
Replace (strFormat, "{1}", value2)
它不工作。任何解决方案
我有以下格式: 值1是{0},值2是{1}。VBScript:格式化字符串的最简单方法是什么?
我需要用括号替换括号中的数字。这很容易在大多数语言中使用string.Format或沿着这些行的东西来完成。我怎样才能做到这一点只使用VBScript?
我已经试过:
Replace (strFormat, "{0}", value1)
Replace (strFormat, "{1}", value2)
它不工作。任何解决方案
Replace (strFormat, "{0}", value1)
基于您的代码剪断,我猜你相信strFormat
直接替换变异。它不这样工作;你的结果分配给原来的变量是这样的:
strFormat = Replace (strFormat, "{0}", value1)
还可以分配到另一个变量来存储改变的结果,就像这样:
strFormat2 = Replace (strFormat, "{0}", value1)
为什么不呢?此代码适用于此处:
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
值。
如果您需要更灵活的实现,您可以使用正则表达式,但现在似乎不需要。
这里是一个不错的小功能的工作原理像.NET的string.Format函数。我很快做到了这一点,所以添加err处理取决于您。我这样做的VB6,并添加了参考微软的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年的工作“, ”布鲁斯“, ”克里斯“, ”凯尔“)
返回:
您好布鲁斯。我希望你能见到克里斯。他们都为凯尔工作。布鲁斯在凯尔工作了15年。
可能会对VBScript进行一些调整,但是这个函数看起来可能是通用的,而不仅仅是一个简单的Replace函数。 – Chris 2009-12-03 19:04:32
我想要类似的东西,并不喜欢任何这些答案,因为它们表示每个值的多行(忽略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
您可以使用以下则(请注意,您需要添加“阵列()”在你的变量):
formatString = "Test '{0}', '{2}', '{1}' and {0} again!"
Response.Write StrFormat(formatString, Array(1, 2, "three", "Unused"))
Response.Write StrFormat(formatString, Array(4, 5, "six", "Unused"))
将输出什么你期望:
Test '1', 'three', '2' and 1 again!
Test '4', 'six', '5' and 4 again!
希望这对于其他语言的人来说更自然一些。
这是恕我直言,最好的答案;简单且可重复使用。我几乎赞成它,但后来我遇到了麻烦。事情是,你的例子修改'SourceString'。当'SourceString'包含一个你将要重用的格式字符串时,这是不好的。随后对'StringFormat(SourceString,...)'的调用将不起作用,因为'SourceString'包含前一次调用的结果。我会编辑你的答案来解决这个问题。 – 2012-09-05 15:13:23
已编辑。我将参数'SourceString'的名称改为'FormatString'。例如。 [.Net的String.Format](http://msdn.microsoft.com/en-us/library/b1csw23d.aspx)的第一个参数的名称为'format'。现在,我可以upvote! – 2012-09-05 15:26:59
我在这个解决方案中看到的唯一可能的问题是包含更高参数数字格式的参数将被替换。 – EdGruberman 2014-05-08 20:01:42
作为一切答案到目前为止解决的格式化问题(相 到内插/剪接串为字符串):
这个简单的类:
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格式。现在,你可以这样做:
-------- 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中的格式化,以StringBuilder.AppendFormat Method (String, Object)开始, Formatting Types。
呵呵,谢谢。这总是很简单。 – Paxenos 2009-12-03 15:55:18
他不需要_another_变量,但只是为了更新原始字符串。 – 2009-12-03 16:07:34