2009-12-03 35 views
5

Tôi có định dạng sau: Giá trị 1 là {0} và Value2 là {1}.VBScript: Cách đơn giản nhất để định dạng chuỗi là gì?

Tôi cần phải thay thế các số trong dấu ngoặc vuông bằng các chuỗi. Điều này có thể dễ dàng thực hiện trong hầu hết các ngôn ngữ bằng cách sử dụng string.Format hoặc một cái gì đó dọc theo những dòng đó. Làm thế nào tôi có thể làm điều này bằng cách sử dụng chỉ VBScript?

Tôi đã thử:

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

Nó không làm việc. Bất kỳ giải pháp?

Trả lời

9

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

Dựa trên snip mã của bạn, tôi đoán bạn tin Thay thế đột biến strFormat trực tiếp. Nó không hoạt động như thế; Bạn gán kết quả vào biến ban đầu như thế này:

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

Bạn cũng có thể gán cho biến khác để lưu trữ các kết quả đã thay đổi, như thế này:

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

Hehe, Cảm ơn. Nó luôn luôn là một cái gì đó đơn giản. – Paxenos

+6

anh ta không cần biến _another_, nhưng chỉ để cập nhật chuỗi gốc. –

0

Tại sao không? Mã này hoạt động tại đây:

value1 = "1" 
value2 = "2" 

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

MsgBox strFormat 

Lưu ý Tôi cập nhật giá trị strFormat cho mỗi lần thay thế.

Nếu bạn cần triển khai linh hoạt hơn, bạn có thể sử dụng cụm từ thông dụng, nhưng có vẻ như không cần thiết bây giờ.

0

Dưới đây là một chức năng ít tốt đẹp mà làm việc giống như hàm .NET string.Format. Tôi đã làm điều này một cách nhanh chóng để thêm xử lý lỗi là tùy thuộc vào bạn. Tôi đã làm điều này trong VB6 và thêm một tham chiếu đến 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 

Ví dụ:.

StringFormat ("Xin chào {0} Tôi muốn bạn gặp gỡ {1} . cả hai đều làm việc cho {2} {0} đã làm việc cho {2} trong 15 năm ", "Bruce", "Chris", "Kyle")

Returns:..

Xin chào Bruce. Tôi muốn bạn gặp Chris. Cả hai đều làm việc cho Kyle. Bruce đã làm việc cho Kyle trong 15 năm.

+0

Một vài điều chỉnh có thể được thực hiện cho VBScript, nhưng chức năng này trông giống như nó có thể linh hoạt hơn chỉ là một chức năng Thay thế đơn giản. – Chris

10

Tôi muốn một cái gì đó tương tự và không thích bất kỳ câu trả lời nào vì chúng có nghĩa là nhiều dòng cho mỗi giá trị (Bỏ qua câu trả lời của Beaner là sai ngôn ngữ!) Vì vậy tôi tạo ra như sau:

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 

Bạn có thể sử dụng dữ liệu sau rồi (lưu ý rằng bạn cần phải thêm "Array()" xung quanh các biến của bạn):

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

nào sẽ ra gì bạn mong đợi:

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

Hy vọng điều này sẽ tự nhiên hơn một chút đối với những người từ các ngôn ngữ khác.

+1

Đây là IMHO câu trả lời hay nhất; đơn giản và có thể tái sử dụng. Tôi gần như upvoted nó, nhưng sau đó tôi gặp rắc rối. Thing là, ví dụ của bạn sửa đổi 'SourceString'. Điều đó không tốt khi 'SourceString' chứa một chuỗi định dạng mà bạn sẽ sử dụng lại. Các cuộc gọi tiếp theo tới 'StringFormat (SourceString, ...)' sẽ không hoạt động vì 'SourceString' chứa kết quả của cuộc gọi trước đó. Tôi sẽ chỉnh sửa câu trả lời của bạn để sửa lỗi này. –

+1

Đã chỉnh sửa. Tôi đã thay đổi tên của tham số 'SourceString' thành' FormatString'. Ví dụ. [.Net của String.Format] (http://msdn.microsoft.com/en-us/library/b1csw23d.aspx) có tên 'định dạng' cho tham số đầu tiên. Bây giờ, tôi có thể upvote! –

+0

Vấn đề duy nhất tôi có thể thấy với giải pháp này là các đối số chứa các định dạng số đối số sau này sẽ được thay thế. – EdGruberman

4

Như none các câu trả lời cho đến nay giải quyết vấn đề của định dạng (như trái ngược để nội suy/dây nối thành chuỗi):

này Lớp đơn giản:

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 

khai thác. NET định dạng cho VBScript thông qua COM. Bây giờ bạn có thể làm:

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

Nếu bạn quan tâm đến các kịch bản thử nghiệm/demo để làm một số thí nghiệm của riêng bạn:

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 

Để tìm hiểu về định dạng trong .NET, bắt đầu với StringBuilder.AppendFormat Method (String, Object)Formatting Types.

Xem herehere để có ý tưởng để đưa vào (không sao chép & Dán) một lớp như vậy vào tập lệnh của bạn.

Các vấn đề liên quan