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

3

我需要在特定格式的消息框中打印字符串,为此我使用类似下面展示的代码:

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中打印它。一个字符和一个空格所占的空间是不同的。有没有解决方案?


1
使用调试器查找是String.Format()还是MessageBox。 - H H
1
只是一个提示(与问题无关):在编写循环时,最好使用StringBuilder而不是使用字符串的+=(字符串是不可变的,因此+=的成本很高),尽管在您的情况下这并不重要。 - jdehaan
5个回答

5
尝试使用 \t 插入值之间的制表符。

+1 这是让消息框中的内容对齐的唯一方法。 - Ben M

2
这不起作用是因为MessageBox使用等宽字体,字母M比字母l宽得多。就像你现在阅读的这条消息一样。只有当使用固定间距字体显示时,您才可以期望此类对齐方式起作用。更改消息框字体不合适,它是系统设置。
使用制表符可以使其略微好些:
text += String.Format("{0}\t{1}\t{2}", a, b, c);

但是,如果字段大小接近制表符大小,则它并不是百分之百可靠的。请使用View = Details的ListView来代替。


1

不确定这是否是您的意思,但请使用等宽字体,例如 "Courier New"。如果您已经这样做了,那么对于这个显而易见的答案我很抱歉。

算了吧:根据这个线程,标准MessageBox无法实现。也许一个选项是创建自己的MessageBox类。


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中缺乏相同宽度字体,它不能正确对齐。但另一方面,使用相同宽度字体的控制台应用程序确实完全对齐。


0

无论是来自 Forms 还是 WPF 的 MessageBox 类,都只是 win32 消息框的一个包装器,因此程序员不能(轻松地)像更改字体为等宽字体那样做,以便所有字符都可以与字符串格式化很好地对齐。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接