2009-12-03 4 views
5

Ich habe das folgende Format: Wert1 ist {0} und Wert2 ist {1}.VBScript: Was ist der einfachste Weg, um eine Zeichenkette zu formatieren?

Ich muss die Zahlen in den Klammern durch Strings ersetzen. Dies ist in den meisten Sprachen leicht mit string.Format oder etwas in diesen Zeilen möglich. Wie kann ich dies nur mit VBScript tun?

Ich habe versucht:

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

Es funktioniert nicht. Irgendwelche Lösungen?

Antwort

9

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

Basierend auf Ihren Code Schnipsel, vermute ich Sie strFormat direkt ersetzen mutiert glauben. So funktioniert es nicht; Sie ordnen das Ergebnis der ursprünglichen Variablen wie folgt aus:

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

Sie auch andere Variablen zuweisen können die geänderten Ergebnisse zu speichern, wie folgt aus:

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

Hehe, Danke. Es ist immer etwas Einfaches. – Paxenos

+6

er benötigt keine _andere_ Variable, sondern nur um die ursprüngliche Zeichenkette zu aktualisieren. –

0

Warum nicht? Dieser Code funktioniert hier:

value1 = "1" 
value2 = "2" 

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

MsgBox strFormat 

Hinweis ich meine strFormat Wert aktualisieren für jeden ersetzen.

Wenn Sie eine flexiblere Implementierung benötigen, können Sie mit einem regulären Ausdruck arbeiten, der jetzt jedoch nicht erforderlich ist.

0

hier eine nette kleine Funktion ist, die funktioniert etwas wie die .NET String.Format-Funktion. Ich habe das schnell gemacht, also ist das Hinzufügen von Fehlerhandhabung ganz Ihnen überlassen. Ich tat dies in VB6 und fügte einen Verweis auf 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 

. Beispiel:

String ("Hallo {0} Ich würde Sie gerne treffen {1} beide arbeiten für Sie {2} {0} arbeitete für {2} für 15 Jahre ", "Bruce", "Chris", "Kyle")

Rückkehr:...

Hallo Bruce. Ich möchte, dass du Chris triffst. Sie arbeiten beide für Kyle. Bruce arbeitet seit 15 Jahren für Kyle.

+0

Für VBScript können einige Anpassungen vorgenommen werden, aber diese Funktion scheint vielseitiger zu sein als nur eine einfache Replace-Funktion. – Chris

10

Ich wollte etwas ähnliches und mochte keine dieser Antworten, da sie mehrere Zeilen für jeden Wert bedeuteten (Ignorieren Beauners Antwort ist für die falsche Sprache!), So habe ich die folgenden:

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 

Sie können die dann folgende verwenden (beachten Sie, dass Sie "Array (hinzufügen müssen)" um Ihre Variablen):

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

Welche ausgibt, was Sie erwarten:

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

Ich hoffe, dass dies ein bisschen natürlicher für Menschen aus anderen Sprachen fühlt.

+1

Dies ist IMHO die beste Antwort; einfach und wiederverwendbar. Ich habe es fast aufgewertet, aber dann geriet ich in Schwierigkeiten. Das ist, Ihr Beispiel ändert 'SourceString'. Das ist nicht gut, wenn 'SourceString' eine Formatzeichenfolge enthält, die Sie wiederverwenden werden. Nachfolgende Aufrufe von 'StringFormat (SourceString, ...)' funktionieren nicht, da 'SourceString' das Ergebnis des vorherigen Aufrufs enthält. Ich werde Ihre Antwort bearbeiten, um dies zu beheben. –

+1

Bearbeitet. Ich habe den Namen des Parameters 'SourceString' in' FormatString' geändert. Z.B. [.Net's String.Format] (http://msdn.microsoft.com/en-us/library/b1csw23d.aspx) hat den Namen 'format' für den ersten Parameter. Jetzt kann ich upvote! –

+0

Das einzige mögliche Problem, das ich bei dieser Lösung sehe, ist, dass Argumente, die spätere Argumentnummernformate enthalten, selbst ersetzt werden. – EdGruberman

4

Wie keine der Antworten Adressen bisher das Problem der Formatierung (wie zu interpoliert/Splicing-Strings in Strings entgegengesetzt):

Diese einfache Klasse:

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 

Geschirr. NET-Formatierung für VBScript über COM. Jetzt können Sie tun:

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

Wenn Sie Interesse an dem Test/Demo-Skript sind einige Experimente Ihrer eigenen zu tun:

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 

Um zu erfahren, in .NET Formatierung, beginnen Sie mit StringBuilder.AppendFormat Method (String, Object) und Formatting Types.

Siehe here und here für Ideen zu enthalten (nicht kopieren & einfügen) eine solche Klasse in Ihr Skript.

Verwandte Themen