如何在.Net中将字符串格式化为固定宽度字段?

时间:2011-08-01 21:50:57

标签: .net vb.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

这使用扩展方法来清理语法,如Joel和Merlyn所建议的那样,并使用StringBulider Append重载来避免创建必须进行垃圾收集的新字符串,如supercat所建议的那样。感谢那些帮助过的人。

4 个答案:

答案 0 :(得分:6)

  

我想知道是否有一种替代方法看起来更优雅并避免填充字符串

(强调补充)

<Extension()> _
Public Function AppendFixed(ByVal target As StringBuilder, ByVal value As String, ByVal desiredLength As Integer) As StringBuilder
    If value.Length < desiredLength Then value.PadRight(desiredLength)
    Return target.Append(value.Substring(0,desiredLength))
End Function

使用它:

b.AppendFixed(s, 20)

答案 1 :(得分: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))

答案 2 :(得分:1)

我建议最小化垃圾收集器的压力,应该单独处理需要从需要将字符串附加到StringBuilder的字符串返回的情况。人们还应该将要追加的字符串短于所需的字符串,精确到期望的长度或比所需长度更长的情况分开。

如果需要返回与原始字符串长度相同的字符串,只需返回原始字符串即可。如果字符串需要填充,请使用New String('',requestedLength-TheString.Length)填充它。如果需要缩短,请返回TheString.Substring(0,requestedLength)。

如果需要向StringBuilder附加内容并且原始字符串不再需要,请附加字符串,然后使用Append的(char,int)重载来添加填充(如果需要)。如果原始字符串太长,请使用Append的(String,int,int)重载来添加适当的部分。

答案 3 :(得分:0)

函数MakeFixedLength(ByVal str As String,ByVal desiredLength As Integer,ByVal LR As String,ByVal chr As Char)As String

    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