.net-C#-在字符串中插入可变数量的空格? (格式化输出文件)

好的,我从一个填充了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);

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

提前致谢!

-Sootah

5个解决方案
103 votes

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

有关更多信息,请参见String.PadRight方法(Int32)。

Gabe answered 2020-01-12T15:03:16Z
41 votes

使用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
Jeff Mercado answered 2020-01-12T15:03:45Z
3 votes

使用{0,-20}

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,负号保证该字符串从左到右打印。

Cheng Chen answered 2020-01-12T15:04:10Z
2 votes

只是为了踢球,这是我在拥有.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";
    }
Sootah answered 2020-01-12T15:04:33Z
0 votes

我同意Justin,在这里可以使用ASCII代码引用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;
    }

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

David Rokni answered 2020-01-12T15:05:02Z
translate from https://stackoverflow.com:/questions/4982807/c-sharp-insert-a-variable-number-of-spaces-into-a-string-formatting-an-outpu