2011-08-01 63 views
5

我想將一個任意長度的字符串格式化爲一個固定寬度的字段來顯示。如何在.Net中將字符串格式化爲固定寬度字段?

我們以20的寬度爲例,並調用要格式化的字符串s。我將格式化的字符串添加到名爲b的StringBuilder中。

Dim b As New System.Text.StringBuilder() 
Dim s as New String 

如果我要顯示的字符串長度超過20個字符的短,我可以這樣做:

b.Append(s.PadRight(20)) 

b.AppendFormat("{0,-20}", s) 

到目前爲止,一切都很好。但是,如果字符串的長度超過20個字符,我希望該字符串被截斷爲20個字符,因爲它被追加。上面的代碼附加整個字符串。

我嘗試這樣做:

b.Append(s.Substring(0,20).PadRight(20)) 

但是,這觸發一個例外,如果字符串是少於20個字符。

所以,我結束了:

b.Append(s.PadRight(20).Substring(0,20)) 

這似乎做的工作。 PadRight通過在子字符串執行之前確保字符串有20個字符來防止該異常。

我想知道是否有一個替代方法,看起來更優雅,避免填充字符串,以防止子字符串導致異常。我錯過了可以在一個步驟中完成此操作的String.Format功能嗎?

編輯補充解決方案:

我結束了下面的代碼:

Module Extensions 
    <Extension()> _ 
    Function AppendFixed(ByVal b As StringBuilder, ByVal s As String, ByVal width As Integer) As StringBuilder 
     If s.Length >= width Then 
      b.Append(s, 0, width) 
     Else 
      b.Append(s) 
      b.Append(" ", width - s.Length) 
     End If 
     Return b 
    End Function 
End Module 

它使用一個擴展方法來清理語法,喬爾和Merlyn,和用途的建議StringBulider追加重載以避免創建必須被垃圾回收的新字符串,正如supercat所建議的那樣。感謝那些幫助。

+0

你結束了正好我用在需要做到這一點的代碼。我認爲這是完成你所需要的最簡單的方法。 – David

回答

6

我在想,如果有,將看起來更優雅和避免另一種方法填充該字符串

(強調)

​​

要使用它:

b.AppendFixed(s, 20) 
+0

我沒有想過使用擴展方法。謝謝你的提示。 –

+0

+1;這用非常明確的邏輯來回答問題,所以+1。但是'PadRight'不會在內部隱式地執行此檢查(或邏輯等效)嗎? –

3

我不認爲有一個更優雅的方式來做到這一點。雖然你可以換這個功能集成到一個擴展方法:

Imports System.Runtime.CompilerServices 

Module StringExtensions 

    <Extension()> _ 
    Public Function AsFixedWidth(ByVal value As String, desiredLength As Integer) As String 
     return value.PadRight(desiredLength).Substring(0,desiredLength) 
    End Function 

End Module 

而且使用這樣的:

b.Append(s.AsFixedWidth(20)) 
+0

隨時讓我知道,如果我的VB.Net翻譯猜測並沒有削減芥末:) –

+0

你忘了一個ByVal並在Return中使用了一個小寫的r,但它仍然應該編譯和運行,儘管這兩者都是。最大的缺陷是在屬性後缺少_,但我爲你解決了這個問題,它只需要_prior_到.Net 4. –

+0

哦,我幾乎錯過了sub vs功能。你只能從函數返回值。 –

1

我的建議是,儘量減少對垃圾收集應變,應該處理分開的情況下,一個需要返回那些一個字符串,其中一個需要追加一個StringBuilder的字符串。人們還應該分開要附加的字符串比需要的短的情況,恰好是所需的長度,或者比需要的更長的情況。

如果需要返回一個與原始長度相同的字符串,只需返回原始字符串即可。如果字符串需要填充,請使用新字符串('',requestedLength-TheString.Length)填充它。如果它需要縮短,則返回TheString.Substring(0,requestedLength)。

如果需要將某些東西附加到StringBuilder中,並且原始字符串不再超過需要,請附加該字符串,然後使用Append的(char,int)重載以在需要時添加填充。如果原始字符串太長,請使用Append的(String,int,int)重載添加適當的部分。

+0

感謝supercat,指向(char,int)和(String,int,int)重載的指針。我將在我的擴展方法中使用它們。 –

0

功能MakeFixedLength(BYVAL str作爲字符串,BYVAL desiredLength作爲整數,BYVAL LR作爲字符串,BYVAL CHR爲CHAR)作爲字符串

If str.Length >= desiredLength Then 

     Return str.Substring(0, desiredLength) 

    Else 

     If LR = "L" Then 

      Return str.PadLeft(desiredLength, chr).Substring(0, desiredLength) 

     Else 

      Return str.PadRight(desiredLength, chr).Substring(0, desiredLength) 

     End If 

    End If 

End Function 
相關問題