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


199

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

“弦乐在这里”
“弦乐在这里”
“字符串去这里”

如何使用.NET完成?

编辑 -我尝试过Format / PadLeft / PadRight到死。他们不工作。我不知道为什么 我最终编写了自己的函数来执行此操作。

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

感谢您提出的所有出色而正确的答案。


48
:我从来没有一个字符串格式化的问题,我不能前往以下页面回答blog.stevex.net/index.php/string-formatting-in-csharp
jcollum

@jcollum:我很乐意为您的答案投票,但无可奉告
Dinah 2009年

PadLeft为我工作,请检查您是否要离开PadLeft(20,'HERE GOES A SPACE')中的空间
Jedi Master Spooky

什么是“留出空间”。如果您的意思是-我是在“修剪”字符串,那么否。它仍然不起作用。
user72491

Answers:


473

这将为您提供所需的确切字符串:

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

64
应该将其标记为该问题的正确答案,但是看起来OP离开了stackoverflow。
奥利弗·2013年

9
如果您要寻找绿色支票与最高票数,那么您不知道该怎么办;)
Dave Jellison

2
@DaveJellison似乎有人需要编写一个插件来解决此问题,否则SO应该只是使其成为可配置的用户首选项。
Walter Stabosz

1
@WalterStabosz完全同意。
Dave Jellison

2
为什么这样做,而不是:像其他所有格式化用例一样?
LuckyLikey

65

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

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

49

从Visual Studio 2015开始,您还可以使用插值字符串来完成此操作(它是一个编译器技巧,因此,所针对的.net框架版本无关紧要)。

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

9
其ac#6功能。
LuckyLikey

我已经使用C#6多年了,却不知道那一个!推荐:)
Avrohom Yisroel)

17

已显示您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


乔尔(Joel),不错的摘要-我正在尝试使用它,但它并不太中心。看起来返回行应该是这样的(我没有足够的代表进行编辑...):return s.PadLeft((padding / 2)+ s.Length,c).PadRight(width,c);
shaunmartin 2010年

11

试试这个:

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

似乎String.Format()调用是多余的。
乔尔·科恩荷恩

填充方法很好,因为“格式”选项要求长度为常数(即String.Format("{0,-length}", something)不会编译。)
Roberto

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的长度小于期望的长度时,将在两端进行填充。
  4. 由于字符间距是整数,并且没有半角空格,所以我们可能会有不均匀的空格分割。在这种实施方式中,更大的分歧进入了前端。
  5. 该功能需要.NET框架由于PadLeft()PadRight()
  6. 在该函数的最后一行,绑定从左到右,所以firstpad被施加随后desiredLength垫。

这是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);
}

为了帮助理解,使用了整数变量firstpads.PadLeft(firstpad)应用(正确数量的)前导空白。最右边的PadRight(desiredLength)具有较低的绑定,方法是在结尾加上空白。


1
欢迎来到SO 这是一个很棒的第一篇问答的又一个例子。+1
Brian

谢谢Brian,本文开头的原始问题是一个很好的起点。我被我之前的所有帖子和答案所启发。
chi

1

这是我受Joel Coehoorn的回答,Oliver的编辑以及shaunmartin的评论启发而创建的VB.NET版本:

    <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中执行扩展的方式,与C#有点不同)。我的微小变化是将空字符串视为空字符串,并用宽度值填充空字符串(满足我的特殊需求)。希望任何需要它的人都可以轻松地将其转换为C#。如果有更好的方法来引用我上面提到的答案,编辑和评论,这对我的帖子产生了启发,请告诉我,我会做的-我是发布的新手,所以我不知道发表评论(可能没有足够的代表)。


0

我张贴了一篇CodeProject文章,可能是您想要的。

看到: 间接宽度和样式格式的AC#方法。

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

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

表示将varArgs [0]的值放在一个10个字符的宽字段中,如果需要额外的填充空间,则向右倾斜。

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

表示将varArgs [0]的值放在10个字符的宽字段中,如果需要额外的填充空间,则向左倾斜。

编辑:在内部,它是Joel的PadCenter与一些语法分析的组合,以重组格式和varArgs,以实现对String.Format的调用。

-杰西


-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,这将有问题


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

3
不要使用此代码-它会生成很多不必要的字符串分配。请改用内置格式说明符和填充方法。
Oskar Berggren 2015年

1
神圣..想象在循环中使用它:)
LuckyLikey
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.