Проблема с форматированием строки с помощью String.Format в C # - PullRequest
3 голосов
/ 02 июля 2010

Мне нужно напечатать строку в окне сообщения в определенном формате, для которого я использую код, подобный показанному ниже:

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 ]

5 голосов
/ 02 июля 2010

Попробуйте использовать \t для вставки вкладок между значениями.

2 голосов
/ 02 июля 2010

Это не работает, потому что MessageBox использует пропорционально разнесенный шрифт, буква M намного шире, чем буква l.Также как в этом сообщении вы читаете сейчас.Вы можете ожидать, что подобное выравнивание будет работать, только если оно отображается шрифтом с фиксированным шагом.Изменение шрифта окна сообщения не является подходящим, это системная настройка.

Вы можете получить это несколько лучше, используя вкладки:

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

, но это не является надежным, еслиразмер поля приближается к размеру вкладки.Вместо этого используйте ListView с View = Details.

1 голос
/ 02 июля 2010

Не уверен, что это именно то, что вы имеете в виду, но используйте моноширинный шрифт, например " Courier New ".Если вы уже это сделали, то извините за этот очевидный ответ.

Не имеет значения: это невозможно при стандартном MessageBox в соответствии с этим потоком .Может быть, тогда вариант - создать свой собственный класс MessageBox.

0 голосов
/ 02 июля 2010

Класс MessageBox, будь то из Forms или WPF, является просто оберткой вокруг окна сообщений win32, поэтому программист не может (легко) сделать такие вещи, как изменить шрифт на шрифт с фиксированным шагом, чтобы все символы были в строке хорошо с форматированием строки.

Однако вы можете создать свой собственный клон MessageBox, используя форму и метку (и любые нужные вам кнопки), а затем показать его с помощью метода ShowDialog ().

0 голосов
/ 02 июля 2010

Тест, созданный в приложении 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 он не выстраивается должным образом. Но с другой стороны, с консольным приложением, использующим шрифты той же ширины, оно точно совпадает.

...