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

问题描述 投票:180回答:10

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

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

这是如何使用.NET完成的?

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

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

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

.net string
10个回答
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);

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

60
投票

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

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

30
投票

从Visual Studio 2015开始,您也可以使用Interpolated Strings(它是一个编译器技巧),因此您定位的.net框架版本无关紧要。

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

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


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,' ');

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

这是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)通过应用尾随空格来降低绑定。


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#。如果有更好的方式来参考我上面提到的答案,编辑和评论,这些都激发了我的帖子,请让我知道,我会这样做 - 我发布的相对较新,我无法理解发表评论(可能还没有足够的代表)。


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


-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,则会出现问题

© www.soinside.com 2019 - 2024. All rights reserved.