7

次の形式があります: Value1 は {0} で、Value2 は {1} です。

括弧内の数字を文字列に置き換える必要があります。これは、ほとんどの言語で string.Format などを使用して簡単に実行できます。vbscriptのみを使用してこれを行うにはどうすればよいですか?

私はもう試した:

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

それは動作しません。解決策はありますか?

4

5 に答える 5

12

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

あなたのコード スニップに基づいて、Replace がstrFormat直接変異すると信じていると思います。そのようには機能しません。次のように、結果を元の変数に割り当てます。

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

次のように、別の変数に割り当てて、変更された結果を保存することもできます。

strFormat2 = Replace (strFormat, "{0}", value1)
于 2009-12-03T15:51:40.533 に答える
11

私は似たようなものが欲しかったのですが、値ごとに複数の行を意味するため、これらの回答はどれも好きではありませんでした (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()」を追加する必要があることに注意してください)

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!

これが他の言語の人々にとってもう少し自然に感じられることを願っています.

于 2012-06-29T10:05:49.000 に答える
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 の .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 での書式設定について学習するには、まずStringBuilder.AppendFormat メソッド (文字列、オブジェクト)および書式設定の型から始めます。

このようなクラスをスクリプトに含める (コピーして貼り付けるのではなく) アイデアについては、こちらこちらを参照してください。

于 2012-06-29T13:11:05.893 に答える
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置換ごとに値を更新することに注意してください。

より柔軟な実装が必要な場合は、正規表現を使用できますが、現在は必要ないようです。

于 2009-12-03T15:47:32.430 に答える