【问题标题】:.NET Format a string with fixed spaces.NET 格式化带有固定空格的字符串
【发布时间】:2009-03-13 18:29:13
【问题描述】:

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

“字符串在这里” “字符串在这里” “字符串在这里”

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

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

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

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

【问题讨论】:

  • 我从来没有遇到过无法通过访问此页面来回答的字符串格式问题:blog.stevex.net/index.php/string-formatting-in-csharp
  • @jcollum:我很乐意为您的答案投票,但 cmets 无能为力
  • PadLeft 为我工作,检查您是否正在离开 PadLeft(20,'HERE GOES A SPACE') 中的空间
  • “留下空间”是什么意思。如果你的意思是 - 我是在“修剪”字符串,那么没有。还是不行。

标签: .net string


【解决方案1】:

这将为您提供您所要求的字符串:

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

【讨论】:

  • 这应该被标记为问题的正确答案,但看起来OP已经离开了stackoverflow。
  • 如果您寻找绿色检查与最高票数,您不知道该怎么做;)
  • @DaveJellison 似乎有人需要编写一个插件来解决这个问题,或者应该让它成为一个可配置的用户偏好。
  • @WalterStabosz 完全同意。
  • 为什么使用, 而不是: 就像在所有其他格式化用例中一样?
【解决方案2】:

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

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

【讨论】:

  • 它是一个 c# 6 功能。
  • 我已经使用 C#6 多年,但不知道那个!赞成:)
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    您已看到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,很好的 sn-p - 我正在尝试使用它,但它并不完全集中,它的方式。看起来返回线应该是这样的(我没有足够的代表来编辑......): return s.PadLeft((padding / 2) + s.Length, c).PadRight(width, c);
    【解决方案5】:

    试试这个:

    "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() 调用是多余的。
    • Pad 方法很好,因为 Format 选项要求长度是常数(也就是说,String.Format("{0,-length}", something) 不会编译。
    【解决方案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);
    }
    

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

    【讨论】:

    • 欢迎来到 SO,chi。这是伟大的第一个帖子和答案的又一个例子。 +1
    • 谢谢布赖恩,这篇文章顶部的原始问题是一个很好的起点。我受到我之前的所有帖子和答案的启发。
    【解决方案7】:

    这是我创建的 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 中进行扩展的方式,与 C# 有点不同)。我的细微变化是它将空字符串视为空字符串,并用宽度值填充空字符串(满足我的特殊需求)。希望这将为需要它的任何人轻松转换为 C#。如果有更好的方法来引用我上面提到的答案、编辑和 cmets,这激发了我的帖子,请告诉我,我会做的 - 我对发帖比较陌生,我想不通发表评论(可能还没有足够的代表)。

    【讨论】:

      【解决方案8】:

      我发布了一篇可能是您想要的 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 的组合。

      -杰西

      【讨论】:

        【解决方案9】:

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

        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 超过总长度,这将有问题

        【讨论】:

          【解决方案10】:
          /// <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;
          }
          

          【讨论】:

          • 不要使用这个代码——它会产生很多不必要的字符串分配。请改用内置格式说明符和填充方法。
          • holy.. 想象一下在循环中使用它:)
          猜你喜欢
          • 2017-04-30
          • 1970-01-01
          • 2012-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多