2009-12-03 21 views
5

Tengo el siguiente formato: El valor 1 es {0} y el valor 2 es {1}.VBScript: ¿Cuál es la forma más sencilla de formatear una cadena?

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?

que he probado:

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

No funciona. Alguna solución?

Respuesta

9

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

Basado en su sección de código, supongo que usted cree Reemplazar muta strFormat directamente. No funciona así; Se asigna el resultado a la variable original como esto:

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

También puede asignar a otra variable para almacenar los resultados modificados, así:

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

Hehe, gracias. Siempre es algo simple. – Paxenos

+6

no necesita _una otra variable, pero solo para actualizar la cadena original. –

0

¿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 

Nota actualizo mi valor para cada strFormat reemplazar.

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

0

He aquí una pequeña función agradable que trabaja algo así 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 ha añadido una referencia a Microsoft VBScript expresiones regulares 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 conocieras {1} . ambos trabajan para {2} {0} ha trabajado para {2} durante 15 años ", "Bruce", "Chris", "Kyle")

Devuelve:..

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

+0

Se pueden hacer algunos ajustes para VBScript, pero esta función parece ser más versátil que una simple función Reemplazar. – Chris

10

Yo 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!) Por lo que crean los siguientes:

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 

Usted puede usar la siguiente continuación (tenga en cuenta que es necesario agregar "Array()" en torno a 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")) 

¿Cuál es la salida lo esperas:

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.

+1

Esto es en mi humilde opinión la mejor respuesta; simple y reutilizable. Casi lo remonté, pero luego tuve problemas. La cosa es que tu ejemplo modifica 'SourceString'. Eso no es bueno cuando 'SourceString' contiene una cadena de formato que reutilizará. Las llamadas posteriores a 'StringFormat (SourceString, ...)' no funcionarán porque 'SourceString' contiene el resultado de la llamada anterior. Editaré tu respuesta para arreglar esto. –

+1

Editado. Cambié el nombre del parámetro 'SourceString' a' FormatString'. P.ej. [.Net's String.Format] (http://msdn.microsoft.com/en-us/library/b1csw23d.aspx) tiene el nombre 'format' para el primer parámetro. ¡Ahora puedo votar! –

+0

El único problema posible que veo con esta solución es que los argumentos que contienen formatos de número de argumento posteriores se reemplazarán ellos mismos. – EdGruberman

4

Como ninguno de las respuestas hasta ahora aborda el problema de formatear (en contraposición a la interpolación de cadenas/empalme en cadenas):

Este sencillo Clase:

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 

arnés. Formato de red para VBScript a través de COM. Ahora se puede 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 usted está interesado en el script de prueba/demo que hacer algunos experimentos de su propia:

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 obtener información sobre el formato en .NET, y empezar con StringBuilder.AppendFormat Method (String, Object)Formatting Types.

Consulte here y here para obtener ideas que incluyan (no Copie & Pegar) dicha Clase en su secuencia de comandos.

Cuestiones relacionadas