VBScript: Какой самый простой способ отформатировать строку? - PullRequest
5 голосов
/ 03 декабря 2009

У меня есть следующий формат: Значение1 равно {0}, а Значение2 равно {1}.

Мне нужно заменить числа в скобках на строки. Это легко сделать в большинстве языков, используя string.Format или что-то в этом роде. Как я могу сделать это, используя только VBScript?

Я пробовал:

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

Это не работает. Любые решения?

Ответы [ 5 ]

10 голосов
/ 29 июня 2012

Я хотел что-то похожее, и мне не понравились эти ответы, так как они означали несколько строк для каждого значения (игнорируя ответ Бинера для неправильного языка!), Поэтому я создал следующее:

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!

Надеюсь, это будет немного более естественно для людей с других языков.

9 голосов
/ 03 декабря 2009

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

Исходя из вашего фрагмента кода, я полагаю, вы верите, что Заменить мутирует strFormat напрямую. Это не работает так; Вы присваиваете результат исходной переменной следующим образом:

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

Вы также можете назначить другую переменную для хранения измененных результатов, например:

strFormat2 = Replace (strFormat, "{0}", value1)
4 голосов
/ 29 июня 2012

Поскольку нет ответов до сих пор решает проблему форматирования (в отличие от для интерполяции / объединения строк в строки):

Этот простой класс:

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

использовать форматирование .NET для VBScript через COM. Теперь вы можете сделать:

-------- 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 (String, Object) и Типы форматирования .

См. здесь и здесь для идей по включению (не копированию и вставке) такого класса в ваш сценарий.

0 голосов
/ 03 декабря 2009

Вот хорошая маленькая функция, которая работает примерно так же, как .NET string.Format function. Я сделал это быстро, поэтому добавление обработки ошибок зависит от вас. Я сделал это в 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 лет.", "Брюс", " Крис "," Кайл ")

Возвращает:

Привет, Брюс. Я бы хотел, чтобы вы встретились с Крисом. Они оба работают на Кайла. Брюс проработал на Кайла 15 лет.

0 голосов
/ 03 декабря 2009

Почему бы и нет? Этот код работает здесь:

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 для каждой замены.

Если вам нужна более гибкая реализация, вы можете использовать регулярное выражение, но сейчас это не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...