.NET格式化具有固定空格的字符串

时间:2009-03-13 18:29:14

标签: .net string

.NET String.Format方法是否允许将字符串放置在固定长度字符串中的固定位置。

"           String Goes Here"
"     String Goes Here      "
"String Goes Here           "

如何使用.NET完成?

编辑 - 我尝试过Format / PadLeft / PadRight致死。它们不起作用。我不知道为什么。我最终编写了自己的函数来完成这项工作。

编辑 - 我犯了一个错误,并在格式说明符中使用了冒号而不是逗号。应该是“{0,20}”。

感谢所有优秀而正确的答案。

10 个答案:

答案 0 :(得分:431)

这将准确提供您要求的字符串:

string s = "String goes here";
string lineAlignedRight  = String.Format("{0,27}", s);
string lineAlignedCenter = String.Format("{0,-27}",
    String.Format("{0," + ((27 + s.Length) / 2).ToString() +  "}", s));
string lineAlignedLeft   = String.Format("{0,-27}", s);

答案 1 :(得分:60)

至少可以使用以下语法来实现第一个和最后一个:

String.Format("{0,20}", "String goes here");
String.Format("{0,-20}", "String goes here");

答案 2 :(得分:30)

从Visual Studio 2015开始,您也可以使用Interpolated Strings执行此操作(这是一个编译器技巧,因此您所针对的.net框架的版本并不重要。)

string value = "String goes here";
string txt1 = $"{value,20}";
string txt2 = $"{value,-20}";

答案 3 :(得分:15)

您已看到PadLeftPadRight。这将填写缺少的PadCenter

public static class StringUtils
{
    public static string PadCenter(this string s, int width, char c)
    {
        if (s == null || width <= s.Length) return s;

        int padding = width - s.Length;
        return s.PadLeft(s.Length + padding / 2, c).PadRight(width, c);
    }
}

自我注意:不要忘记更新自己的简历:“有一天,我甚至修复了Joel Coehoorn的代码!” ; -D -Serge

答案 4 :(得分:9)

试试这个:

"String goes here".PadLeft(20,' ');
"String goes here".PadRight(20,' ');

为中心获取字符串的长度,并使用必要的字符执行padleft和padright

int len = "String goes here".Length;
int whites = len /2;
"String goes here".PadRight(len + whites,' ').PadLeft(len + whites,' ');

答案 5 :(得分:6)

感谢您的讨论,这个方法也适用(VB):

Public Function StringCentering(ByVal s As String, ByVal desiredLength As Integer) As String
    If s.Length >= desiredLength Then Return s
    Dim firstpad As Integer = (s.Length + desiredLength) / 2
    Return s.PadLeft(firstpad).PadRight(desiredLength)
End Function
  1. StringCentering()获取两个输入值,并返回格式化的值 串。
  2. s 的长度大于或等于 deisredLength 时,该函数会返回原始字符串。
  3. s 的长度小于 desiredLength 时,它将被填充两端。
  4. 由于字符间距是整数且没有半空间,我们可以有不均匀的空间分割。在此实现中,更大的分割进入前端。
  5. 由于 PadLeft() PadRight(),该功能需要.NET Framework。
  6. 在该功能的最后一行,绑定是从左到右,因此应用 firstpad ,然后应用 desiredLength 打击垫。
  7. 这是C#版本:

    public string StringCentering(string s, int desiredLength)
    {
        if (s.Length >= desiredLength) return s;
        int firstpad = (s.Length + desiredLength) / 2;
        return s.PadLeft(firstpad).PadRight(desiredLength);
    }
    

    为了帮助理解,使用整数变量 firstpad s.PadLeft(firstpad)应用(正确数量)前导空格。最右边的 PadRight(desiredLength)通过应用尾随空格来完成较低的绑定。

答案 6 :(得分:1)

这是我创建的VB.NET版本,灵感来自Joel Coehoorn的回答,Oliver的编辑和shaunmartin的评论:

    <Extension()>
Public Function PadCenter(ByVal [string] As String, ByVal width As Integer, ByVal c As Char) As String

    If [string] Is Nothing Then [string] = String.Empty
    If (width <= [string].Length) Then Return [string]

    Dim padding = width - [string].Length
    Return [string].PadLeft([string].Length + (padding \ 2), c).PadRight(width, c)

End Function

<Extension()>
Public Function PadCenter(ByVal [string] As String, ByVal width As Integer) As String

    If [string] Is Nothing Then [string] = String.Empty
    If (width <= [string].Length) Then Return [string]

    Dim padding = width - [string].Length
    Return [string].PadLeft([string].Length + (padding \ 2)).PadRight(width)

End Function

这是在公共模块中设置为字符串扩展(在VB.NET中使用Extensions的方式,与C#略有不同)。我的微小变化是它将空字符串视为空字符串,并使用宽度值填充空字符串(满足我的特定需求)。希望对于需要它的人来说,这将轻松转换为C#。如果有更好的方式来参考我上面提到的答案,编辑和评论,这些都激发了我的帖子,请让我知道,我会这样做 - 我发布的相对较新,我无法理解发表评论(可能还没有足够的代表)。

答案 7 :(得分:0)

我发布了一篇CodeProject文章,可能就是你想要的。

请参阅:A C# way for indirect width and style formatting.

基本上它是一个方法FormatEx,它的作用类似于String.Format,除了它允许居中的对齐修饰符。

FormatEx("{0,c10}", value);

意味着将varArgs [0]的值置于10个字符宽的字段中,如果需要额外的填充空间,则向右倾斜。

FormatEx("{0,c-10}", value);

意味着将varArgs [0]的值置于10个字符宽的字段中,如果需要额外的填充空间,则向左倾斜。

编辑:在内部,它是Joel的PadCenter与一些解析重组格式的组合,varArgs是对String.Format的调用,它可以满足你的需要。

-Jesse

答案 8 :(得分:-1)

看起来你想要这样的东西,它会把你的字符串放在一个恒定长度的字符串中的固定点:

Dim totallength As Integer = 100
Dim leftbuffer as Integer = 5
Dim mystring As String = "string goes here"
Dim Formatted_String as String = mystring.PadLeft(leftbuffer + mystring.Length, "-") + String.Empty.PadRight(totallength - (mystring.Length + leftbuffer), "-")

请注意,如果mystring.length + leftbuffer超过totallength

,则会出现问题

答案 9 :(得分:-7)

/// <summary>
/// Returns a string With count chars Left or Right value
/// </summary>
/// <param name="val"></param>
/// <param name="count"></param>
/// <param name="space"></param>
/// <param name="right"></param>
/// <returns></returns>
 public static string Formating(object val, int count, char space = ' ', bool right = false)
{
    var value = val.ToString();
    for (int i = 0; i < count - value.Length; i++) value = right ? value + space : space + value;
    return value;
}