使用C#中的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中打印它。 角色和“空间”所占的空间是不同的。 对此有何解决方案?

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

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

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

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

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

不确定它是否实际上是你的意思,但使用像“ Courier New ”这样的等宽字体。 如果你已经做了,那么抱歉这个明显的答案。

没关系:标准的MessageBox不可能符合这个线程 。 也许然后一个选项是创建自己的MessageBox类。

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

  public void Test1() { List> list = new List>() { new List() { "XYZ", "ABC","100" }, new List() { "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 = new List>() { new List() { "XYZ", "ABC","100" }, new List() { "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缺少相同宽度的字体,它没有正确排列。 但另一方面,使用相同宽度字体的控制台应用程序,它确实排队。

MessageBox类,无论是来自Forms还是WPF,都只是win32消息框的包装器,因此程序员无法(轻松地)将字体更改为固定间距字体,因此所有字符都与字符串格式。

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