如何在c#中动态设置字段宽度

问题描述 投票:0回答:3

我希望能够根据字符串长度动态设置字段宽度。

这是我的代码。

static void Main(string[] args)
    {
        string[] names = { "Adam", "Ron", "Carla", "Daniel", "Farla", "Marrietta" };
        decimal[] hours = { 40, 6.667M, 40.39M, 82, 40.333M, 80 };

        var sorted = names.OrderBy(n => n.Length);
        int longest = sorted.LastOrDefault().Length + 1;

        Console.WriteLine($"{"Name", longest} {"Hours",5}\n");
        for(var ctr = 0; ctr < names.Length; ctr++)
        {
            Console.WriteLine($"{names[ctr],longest} {hours[ctr],5:N1}");
        }

    }

我收到一个错误,认为常量值是“而不是”最长的。

c#
3个回答
2
投票

string.Format()
(以及相应的字符串插值)需要这些格式的常量值。

您可以使用

string.PadLeft()
代替:

for(var ctr = 0; ctr < names.Length; ctr++)
{
    Console.WriteLine($"{names[ctr].PadLef(longest)} {hours[ctr],5:N1}");
}

0
投票

您的代码失败,因为迭代不允许在字段宽度表达式中使用变量

尝试使用 string.PadRight 代替:

static void Main(string[] args)
{  
    string[] names = new string[] { "Adam", "Ron", "Carla", "Daniel", "Farla", "Marrietta" };
    decimal[] hours = { 40, 6.667M, 40.39M, 82, 40.333M, 80 };

    var sorted = names.OrderBy(n => n.Length);
    int longest = sorted.LastOrDefault().Length + 1;

    //Console.WriteLine($"{"Name", longest} {"Hours",5}\n");
    for(var ctr = 0; ctr < names.Length; ctr++)
    {
        string msg = String.Format("{0} {1,5:N1}", names[ctr].PadRight(longest), hours[ctr]);
        Console.WriteLine(msg);
    }

}

0
投票

您可以使用“string.Format()”;例如输出两个数字 - '99' 和 '100' 作为 4 个字符的宽度(- 带前导/左侧空格填充):

void Main()
{
    int num;

    var charWidth = 4;

    var fmtStr = $"'{{0,{charWidth}}}'";

    //

    num = 99;
    Console.WriteLine(string.Format(fmtStr, num));

    //

    num = 100;
    Console.WriteLine(string.Format(fmtStr, num));
}

输出:

'  99'
' 100'
© www.soinside.com 2019 - 2024. All rights reserved.