使用C#中的String.Format格式化字符串时出现问题

时间:2010-07-02 18:20:32

标签: c# messagebox string.format

我需要在特定格式的消息框中打印一个字符串,我使用的代码如下所示:

string text=""; 
for (int i=0; i<n; i++)
{
   a=..
   b=..
   c=..
   text += String.Format("{0, -8} {1,-4} {2,8}", a, b, c);
}
MessageBox.Show(text);

所以对于以下一组值:

XYZ,ABC,100

X,ABC,100

我得到以下输出:

XYZ     ABC     100

X     ABC     100

所以你可以看到第二行格式不正确。 可能这种情况正在发生,因为我在MessageBox中打印它。 角色和“空间”所占据的空间是不同的。 对此有何解决方案?

5 个答案:

答案 0 :(得分:5)

尝试使用\t在值之间插入标签。

答案 1 :(得分:2)

这不起作用,因为MessageBox使用按比例间隔的字体,字母M比字母l宽得多。就像在这条消息中你现在正在阅读。如果使用固定间距字体显示,您只能期望这样的对齐。更改消息框字体是不合适的,它是系统设置。

使用标签可以让它更好一些:

text += String.Format("{0}\t{1}\t{2}", a, b, c);

但如果字段大小接近标签大小,则不是万无一失。使用带有View = Details的ListView。

答案 2 :(得分:1)

不确定它是否真的是您的意思,但请使用monospaced字体,例如“Courier New”。如果你已经做了,那么抱歉这个明显的答案。

没关系:标准MessageBox无法使用此thread。也许然后一个选项是创建自己的MessageBox类。

答案 3 :(得分:0)

使用以下代码在Windows应用程序中创建的测试:

    public void Test1()
    {
        List<List<String>> list = new List<List<string>>() { 
            new List<String>() { "XYZ", "ABC","100" },
            new List<String>() { "X", "ABC", "100"},
        };

        string text = "", a = "", b = "", c = "";
        for (int i = 0; i < list.Count; i++)
        {
            a = list[i][0];
            b = list[i][1];
            c = list[i][2];
            text += String.Format("{0, -8} {1,-4} {2,8}{3}", a, b, c, Environment.NewLine);
        }
        MessageBox.Show(text);
    }

你说的是什么,但在用控制台应用程序检查后用以下代码:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Test1();
            Console.ReadKey();
        }

        public static void Test1()
        {
            List<List<String>> list = new List<List<string>>() { 
                new List<String>() { "XYZ", "ABC","100" },
                new List<String>() { "X", "ABC", "100"},
            };

            string text = "", a = "", b = "", c = "";
            for (int i = 0; i < list.Count; i++)
            {
                a = list[i][0];
                b = list[i][1];
                c = list[i][2];
                text += String.Format("{0, -8} {1,-4} {2,8}{3}", a, b, c, Environment.NewLine);
            }
            Console.WriteLine(text);
        }
    }
}

它符合您的期望。

所以,测试表明的是,如果它正在做它应该做的事情,但由于MessageBox中缺少相同宽度的字体,它没有正确排列。但另一方面,在控制台应用程序使用相同宽度的字体时,它确实排成一行。

答案 4 :(得分:0)

MessageBox类,无论是来自Forms还是WPF,都只是win32消息框的包装器,所以程序员不能(轻松)做一些事情,比如将字体更改为固定间距字体,这样所有字符都行很好地使用字符串格式。

然而,你可以使用Form和Label(以及你需要的任何按钮)制作自己的MessageBox克隆,然后使用ShowDialog()方法显示它。