2009-12-03 143 views
5

我有以下格式: 值1是{0},值2是{1}。VBScript:格式化字符串的最簡單方法是什麼?

我需要用括號替換括號中的數字。這很容易在大多數語言中使用string.Format或沿着這些行的東西來完成。我怎樣才能做到這一點只使用VBScript?

我已經試過:

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

它不工作。任何解決方案

回答

9

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

基於您的代碼剪斷,我猜你相信strFormat直接替換變異。它不這樣工作;你的結果分配給原來的變量是這樣的:

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

還可以分配到另一個變量來存儲改變的結果,就像這樣:

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

呵呵,謝謝。這總是很簡單。 – Paxenos 2009-12-03 15:55:18

+6

他不需要_another_變量,但只是爲了更新原始字符串。 – 2009-12-03 16:07:34

0

爲什麼不呢?此代碼適用於此處:

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值。

如果您需要更靈活的實現,您可以使用正則表達式,但現在似乎不需要。

0

這裏是一個不錯的小功能的工作原理像.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年。

+0

可能會對VBScript進行一些調整,但是這個函數看起來可能是通用的,而不僅僅是一個簡單的Replace函數。 – Chris 2009-12-03 19:04:32

10

我想要類似的東西,並不喜歡任何這些答案,因爲它們表示每個值的多行(忽略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! 

希望這對於其他語言的人來說更自然一些。

+1

這是恕我直言,最好的答案;簡單且可重複使用。我幾乎贊成它,但後來我遇到了麻煩。事情是,你的例子修改'SourceString'。當'SourceString'包含一個你將要重用的格式字符串時,這是不好的。隨後對'StringFormat(SourceString,...)'的調用將不起作用,因爲'SourceString'包含前一次調用的結果。我會編輯你的答案來解決這個問題。 – 2012-09-05 15:13:23

+1

已編輯。我將參數'SourceString'的名稱改爲'FormatString'。例如。 [.Net的String.Format](http://msdn.microsoft.com/en-us/library/b1csw23d.aspx)的第一個參數的名稱爲'format'。現在,我可以upvote! – 2012-09-05 15:26:59

+0

我在這個解決方案中看到的唯一可能的問題是包含更高參數數字格式的參數將被替換。 – EdGruberman 2014-05-08 20:01:42

4

作爲一切答案到目前爲止解決的格式化問題(相 到內插/剪接串爲字符串):

這個簡單的類:

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

請參閱herehere,其中包含(不復制&粘貼)這樣的類到腳本中的想法。

相關問題