【问题标题】:Pad Left & Pad Right (Pad Center) StringPad Left & Pad Right(Pad Center)字符串
【发布时间】:2013-07-09 13:21:41
【问题描述】:

字符串同时具有PadLeftPadRight。我需要左右填充(中心对齐)。有没有一种标准化的方式来做到这一点,或者更好的是,一种实现相同目标的内置方式?

【问题讨论】:

  • Yourstring.PadLeft().PadRight() ?

标签: c#


【解决方案1】:

我不知道。如果您发现自己经常使用它,您可以创建一个扩展方法。假设您希望您的字符串位于中心,请使用以下内容

public string PadBoth(string source, int length)
{
    int spaces = length - source.Length;
    int padLeft = spaces/2 + source.Length;
    return source.PadLeft(padLeft).PadRight(length);

}

要使其成为扩展方法,请这样做:

namespace System
{
    public static class StringExtensions
    {
        public static string PadBoth(this string str, int length)
        {
            int spaces = length - str.Length;
            int padLeft = spaces / 2 + str.Length;
            return str.PadLeft(padLeft).PadRight(length);
        }
    }
}

顺便说一句,我只是在系统命名空间中包含我的扩展 - 由你决定。

【讨论】:

  • 修改最后一行以使用不间断空格 (alt+0160),.PadRight(length, ' ');。即使显示环境不喜欢多个空格,这也有助于保持填充显示。
【解决方案2】:

这是一个自定义实现,不需要重建字符串。

奇数也能正常工作

    static string PadCenter(string text, int newWidth)
    {
        const char filler = ' ';
        int length = text.Length;
        int charactersToPad = newWidth - length;
        if (charactersToPad < 0) throw new ArgumentException("New width must be greater than string length.", "newWidth");
        int padLeft = charactersToPad/2 + charactersToPad%2;
        //add a space to the left if the string is an odd number
        int padRight = charactersToPad/2;

        StringBuilder resultBuilder = new StringBuilder(newWidth);
        for (int i = 0; i < padLeft; i++) resultBuilder.Insert(i, filler); 
        for (int i = 0; i < length; i++) resultBuilder.Insert(i + padLeft, text[i]); 
        for (int i = newWidth - padRight; i < newWidth; i++) resultBuilder.Insert(i, filler);
        return resultBuilder.ToString();
    }

【讨论】:

    【解决方案3】:

    这是@david-colwell 的extension 方法的略微改进版本,它还可以选择采用填充字符:

    namespace System
    {
        public static class StringExtensions
        {
            public static string PadSides(this string str, int totalWidth, char paddingChar = ' ')
            {
                int padding = totalWidth - str.Length;
                int padLeft = padding / 2 + str.Length;
                return str.PadLeft(padLeft, paddingChar).PadRight(totalWidth, paddingChar);
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      你可以自己做:

          string test = "Wibble";
          int padTo = 12;
          int padSize = (padTo - test.Length) / 2;
          if (padSize > 0) {
              test = test.Trim().PadLeft(test.Length + padSize).PadRight(test.Length + 2 * padSize);
          }
      

      只需根据需要调整它以处理奇数填充长度,并使其成为一种扩展方法,如果这样可以让您的生活更轻松。

      【讨论】:

        【解决方案5】:

        我认为这里有点改进。

        namespace System
        {
            public static class StringExtensions
            {
                public static string PadCenter(this string str, int totalLength, char padChar = '\u00A0')
                {
                    int padAmount = totalLength - str.Length;
        
                    if (padAmount <= 1)
                    {
                        if (padAmount == 1)
                        {
                            return str.PadRight(totalLength);
                        }
                        return str;
                    }
        
                    int padLeft = padAmount/2 + str.Length;
        
                    return str.PadLeft(padLeft).PadRight(totalLength);
                }
            }
        }
        

        【讨论】:

        • padChar 在此代码中未使用,为什么它在那里?也许返回行应该是: return str.PadRight(totalLength,padChar);并返回 str.PadLeft(padLeft).PadRight(totalLength,padChar);
        • 你当然是对的。感谢您指出这一点。
        【解决方案6】:

        阅读完本文后,我想提供另一个有用的功能(在打印中)。

        这不是这个问题的答案,而是建立在它之上。

        基于@orad 的回答。

        public static string PadSplit(string str1, string str2, int totalWidth, char paddingChar = ' ')
        {
                string output;
                int paddingWidth = totalWidth - (str1.Length + str2.Length);
                output = string.Format("{0}{1}{2}", str1, string.Empty.PadCenter(paddingWidth, paddingChar), str2);
                return output;
        }
        
        PadSplit("David", "Wins", 16) => "David       Wins"
        

        【讨论】:

          【解决方案7】:
            /* Output looks like this
                 *****Luke***** 
                 *****Leia*****
                 *****Han******
                 **Chewbecca***  */
          
            string result = "";
             string names = "Luke,Leia,Han,Chewbecca";
             string[] charA = names.Split(',');
          
                  for (int i = 0; i < charA.Length; i++)
                  {
                      int padLeft = (14 - charA[i].Length) / 2;
                      string temp = charA[i].PadLeft(charA[i].Length + padLeft, '*');
                      result += temp.PadRight(14, '*') + "\n";
                  }
                  Console.WriteLine(result);
          

          【讨论】:

          • 这个力道没那么强;-)
          【解决方案8】:

          你也可以像这样创建你的扩展:

          public static string PadBoth(this string s, int padValue)
          {
              return s.PadLeft(padValue).PadRight(padValue);
          }
          

          并在字符串上使用 PadBoth 方法。

          【讨论】:

          • 尝试运行这个,我感觉它会和 pad 单独做一样的事情......
          猜你喜欢
          • 1970-01-01
          • 2019-01-10
          • 1970-01-01
          • 2019-12-12
          • 2010-09-22
          • 1970-01-01
          • 2014-06-23
          • 2018-04-22
          • 1970-01-01
          相关资源
          最近更新 更多