【问题标题】:Problem with formatting a string with String.Format in C#在 C# 中使用 String.Format 格式化字符串的问题
【发布时间】:2012-04-12 02:32:03
【问题描述】:

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

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 中打印它。 一个字符和一个“空格”占用的空间是不同的。 有什么解决办法吗?

【问题讨论】:

  • 使用调试器判断是String.Format()还是MessageBox。
  • 只是一个提示(与问题无关):在编写循环时更喜欢使用 StringBuilder 而不是将 += 与字符串一起使用(字符串是不可变的,因此 += 成本很高),这并不重要你的情况很多。

标签: c# messagebox string.format


【解决方案1】:

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

【讨论】:

  • +1 这是让消息框排列整齐的唯一方法。
【解决方案2】:

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

你可以通过使用标签来获得更好的效果:

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

但如果字段大小接近选项卡大小,则并非万无一失。改用 View = Details 的 ListView。

【讨论】:

    【解决方案3】:

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

    没关系:标准 MessageBox 无法与 thread 对应。也许然后一个选项是创建您自己的 MessageBox 类。

    【讨论】:

      【解决方案4】:

      使用以下代码在 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 中缺少相同宽度的字体,它没有正确排列。但另一方面,在控制台应用程序使用相同宽度的字体时,它确实对齐。

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多