【问题标题】:C# - Insert a variable number of spaces into a string? (Formatting an output file)C# - 在字符串中插入可变数量的空格? (格式化输出文件)
【发布时间】:2011-02-13 06:31:42
【问题描述】:

好的,我正在从填充 DataGridView 的列表中获取数据,并将其导出到文本文件中。我已经完成了将其导出为 CSV 的功能,并且还想做一个纯文本版本。

因为标题和其他元素的长度是可变的,所以当文件被保存然后在记事本中打开时,它看起来像一团糟,因为没有排队。

我想让输出看起来像这样:

Sample Title One   Element One   Whatever Else
Sample Title 2     Element 2     Whatever Else
S. T. 3            E3            Whatever Else

我认为我可以遍历每个元素以获得最长元素的长度,这样我就可以计算要为每个剩余元素添加多少空格。

我的主要问题是:有没有一种优雅的方法可以将可变数量的字符添加到字符串中?最好有类似的东西:myString.insert(index, charToInsert, howManyToInsert);

当然,我显然可以只写一个函数来通过循环来执行此操作,但我想看看是否有更好的方法。

提前致谢!

-苏塔

【问题讨论】:

    标签: c# .net visual-studio-2010 string string-formatting


    【解决方案1】:

    为此,您可能需要myString.PadRight(totalLength, charToInsert)

    请参阅String.PadRight Method (Int32) 了解更多信息。

    【讨论】:

    • 漂亮!正是我所希望的。
    • 感谢这个伟大的发现,不敢相信它自 2.0 以来就已经存在,我不知道这是什么!
    【解决方案2】:

    使用String.Format()TextWriter.Format()(取决于您实际写入文件的方式)并指定字段的宽度。

    String.Format("{0,20}{1,15}{2,15}", "Sample Title One", "Element One", "Whatever Else");
    

    您也可以在插值字符串中指定字段的宽度:

    $"{"Sample Title One",20}{"Element One",15}{"Whatever Else",15}"
    

    正如您所知,您可以使用适当的字符串构造器创建一串重复字符。

    new String(' ', 20); // string of 20 spaces
    

    【讨论】:

    • 感谢字符串构造函数信息。我什至不知道为什么会在那里,但我用过!凉爽的! :)
    • 确实,我知道填充...但是我的用例需要在这里找到的构造函数逻辑。谢谢
    • 使用 string.Format (也许结合你的第二行代码)有没有办法为实际的填充数传入一个变量 int?
    • @Edward,你可以。基本上只需构建具有适当宽度的格式字符串并将该格式字符串与String.Format() 一起使用。例如,String.Format($"The value is: {{0,{width}}}", value)
    • 所以我在尝试中参与其中,我需要额外的一对括号(不知道为什么需要双括号)以及在 String.Format 方法中使用 $ .
    【解决方案3】:

    使用String.Format:

    string title1 = "Sample Title One";
    string element1 = "Element One";
    string format = "{0,-20} {1,-10}";
    
    string result = string.Format(format, title1, element1);
    //or you can print to Console directly with
    //Console.WriteLine(format, title1, element1);
    

    {0,-20} 格式中表示第一个参数的长度固定为 20,负号保证字符串从左到右打印。

    【讨论】:

      【解决方案4】:

      只是为了好玩,这是我在拥有 .PadRight 位之前编写的函数:

          public string insertSpacesAtEnd(string input, int longest)
          {
              string output = input;
              string spaces = "";
              int inputLength = input.Length;
              int numToInsert = longest - inputLength;
      
              for (int i = 0; i < numToInsert; i++)
              {
                  spaces += " ";
              }
      
              output += spaces;
      
              return output;
          }
      
          public int findLongest(List<Results> theList)
          {
              int longest = 0;
      
              for (int i = 0; i < theList.Count; i++)
              {
                  if (longest < theList[i].title.Length)
                      longest = theList[i].title.Length;
              }
              return longest;
          }
      
          ////Usage////
          for (int i = 0; i < storageList.Count; i++)
          {
              output += insertSpacesAtEnd(storageList[i].title, longest + 5) +   storageList[i].rank.Trim() + "     " + storageList[i].term.Trim() + "         " + storageList[i].name + "\r\n";
          }
      

      【讨论】:

        【解决方案5】:

        我同意 Justin 的观点,可以使用 ASCII codes here 引用 WhiteSpace CHAR 32号字符代表一个空格,因此:

        string.Empty.PadRight(totalLength, (char)32);
        

        另一种方法: 在自定义方法中手动创建所有空间并调用它:

        private static string GetSpaces(int totalLength)
            {
                string result = string.Empty;
                for (int i = 0; i < totalLength; i++)
                {
                    result += " ";
                }
                return result;
            }
        

        并在您的代码中调用它来创建空格: 获取空间(14);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-17
          • 2016-11-01
          • 2021-01-15
          • 2023-01-29
          • 2018-01-01
          • 1970-01-01
          相关资源
          最近更新 更多