VBScript: ¿Cuál es la forma más sencilla de formatear una cadena?

Tengo el siguiente formato: Value1 es {0} y Value2 es {1}.

Necesito reemplazar los números en los corchetes con cuerdas. Esto se hace fácilmente en la mayoría de los lenguajes utilizando cadena. Formato o algo parecido. ¿Cómo puedo hacer esto usando solo vbscript?

He intentado:

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

No funciona. Alguna solución?

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

En función de tu fragmento de código, supongo que crees que Replace strFormat directamente. No funciona así; Usted asigna el resultado a la variable original como esta:

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

También puede asignar a otra variable para almacenar los resultados modificados, como este:

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

Quería algo similar y no me gustó ninguna de estas respuestas, ya que significaban varias líneas para cada valor (¡ignorar la respuesta de Beaner es por el idioma equivocado!) Así que creé lo siguiente:

 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 

Puede usar lo siguiente a continuación (tenga en cuenta que debe agregar “Array ()” alrededor de sus variables) :

 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")) 

Que dará salida a lo que espera:

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

Espero que esto se sienta un poco más natural para las personas de otros idiomas.

Como ninguna de las respuestas soluciona el problema del formateo (a diferencia de las cadenas de interpolación / empalme en cadenas):

Esta clase simple:

 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 

aprovechar el formato .NET para VBScript a través de COM. Ahora puedes hacer:

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

Si está interesado en el script de prueba / demostración para hacer algunos experimentos propios:

 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 

Para aprender sobre el formateo en .NET, comience con StringBuilder.AppendFormat Method (String, Object) y formateando Types .

Consulte aquí y aquí para obtener ideas para incluir (no copiar y pegar) dicha clase en su secuencia de comandos.

Por qué no? Este código funciona aquí:

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

Tenga en cuenta que actualizo mi valor de strFormat para cada reemplazo.

Si necesita una implementación más flexible, puede ir con una expresión regular, pero no parece necesaria ahora.

Aquí hay una pequeña función que funciona como la cadena .NET. Función de formato. Hice esto rápidamente, por lo que agregar tu error de manejo depende de ti. Hice esto en VB6 y agregué una referencia a Microsoft VBScript Regular Expressions 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 

Ejemplo:

StringFormat (“Hola {0}. Me gustaría que conozcas {1}. Ambos trabajan para {2}. {0} ha funcionado para {2} durante 15 años.”, “Bruce”, “Chris”, “Kyle”)

Devoluciones:

Hola Bruce. Me gustaría que conozcas a Chris. Ambos trabajan para Kyle. Bruce trabajó para Kyle durante 15 años.