Подтвердить что ты не робот

Форматирование строки С# с одинаковым интервалом между значениями

У меня 3 строки. Первый набор строк:

"1.0536"  
"2.1"  
"2" 

Второе - это что-то вроде:

"Round"  
"Square"  
"Hex"

И последнее:

"6061-T6"  
"T351"  
"ASF.3.4.5" 

Мне нужно объединить три строки вместе с одинаковым интервалом между каждой строкой. Я не могу использовать \t для табуляции, так как после объединения строк я отправляю их в базу данных Access.

Когда я объединяю строки, они выглядят так:

"1.0536 Round 6061-T6"  
"2.1 Square T351"  
"2 Hex ASF.3.4.5" 

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

"1.0536     &nbsp раунду;     6061-T6"
"2.1           Square     Т351"
"2               шестигранных           ASF.3.4.5"

Как я могу сделать это с помощью С#?

4b9b3361

Ответ 2

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

String result = String.Format("{0} {1} {2}", strCol1.PadRight(10), strCol2.PadRight(9), strCol3.PadRight(9));

Ответ 3

Чтобы облегчить жизнь, утилиты:

Использование

var data = new[] {
    new[] { "ID", "NAME", "DESCRIPTION" },
    new[] { "1", "Frank Foo", "lorem ipsum sic dolor" },
    new[] { "2", "Brandon Bar", "amet forthrightly" },
    new[] { "3", "B. Baz", "Yeehah!" }
};

var tabbedData = EvenColumns(20, data);
var tabbedData2 = string.Join("\n", EvenColumns(20, false, data)); // alternate line separator, alignment

Результаты

ID                  NAME                DESCRIPTION
1                   Frank Foo           lorem ipsum sic dolor
2                   Brandon Bar         amet forthrightly
3                   B. Baz              Yeehah!

ID                NAME         DESCRIPTION
1           Frank Foolorem ipsum sic dolor
2         Brandon Bar   amet forthrightly
3              B. Baz             Yeehah!

код

public string EvenColumns(int desiredWidth, IEnumerable<IEnumerable<string>> lists) {
    return string.Join(Environment.NewLine, EvenColumns(desiredWidth, true, lists));
}

public IEnumerable<string> EvenColumns(int desiredWidth, bool rightOrLeft, IEnumerable<IEnumerable<string>> lists) {
    return lists.Select(o => EvenColumns(desiredWidth, rightOrLeft, o.ToArray()));
}

public string EvenColumns(int desiredWidth, bool rightOrLeftAlignment, string[] list, bool fitToItems = false) {
    // right alignment needs "-X" 'width' vs left alignment which is just "X" in the `string.Format` format string
    int columnWidth = (rightOrLeftAlignment ? -1 : 1) *
                        // fit to actual items? this could screw up "evenness" if
                        // one column is longer than the others
                        // and you use this with multiple rows
                        (fitToItems
                            ? Math.Max(desiredWidth, list.Select(o => o.Length).Max())
                            : desiredWidth
                        );

    // make columns for all but the "last" (or first) one
    string format = string.Concat(Enumerable.Range(rightOrLeftAlignment ? 0 : 1, list.Length-1).Select( i => string.Format("{{{0},{1}}}", i, columnWidth) ));

    // then add the "last" one without Alignment
    if(rightOrLeftAlignment) {
        format += "{" + (list.Length-1) + "}";
    }
    else {
        format = "{0}" + format;
    }

    return string.Format(format, list);
}

Специфично для вопроса

// for fun, assume multidimensional declaration rather than jagged
var data = new[,] {
    { "1.0536", "2.1", "2" },
    { "Round", "Square", "Hex" },
    { "6061-T6", "T351", "ASF.3.4.5" },
};

var tabbedData = EvenColumns(20, Transpose(ToJaggedArray(data)));

с Transpose:

public T[][] Transpose<T>(T[][] original) {
    // flip dimensions
    var h = original.Length;
    var w = original[0].Length;

    var result = new T[h][];
    for (var r = 0; r < h; r++) {
        result[r] = new T[w];
        for (var c = 0; c < w; c++)
        {
            result[r][c] = original[c][r];
        }
    }
    return result;
}

И многомерные массивы (источник):

public T[][] ToJaggedArray<T>(T[,] multiArray) {
    // via /questions/191576/jagged-arrays-multidimensional-arrays-conversion-in-aspnet
    var h = multiArray.GetLength(0);
    var w = multiArray.GetLength(1);

    var result = new T[h][];
    for (var r = 0; r < h; r++) {
        result[r] = new T[w];
        for (var c = 0; c < w; c++) {
            result[r][c] = multiArray[r, c];
        }
    }
    return result;
}

Ответ 4

Использовать String.Format("{0,10}", myString)
Где 10 - количество символов, которое вы хотите

Ответ 5

Чтобы сделать это более динамично, вы можете сделать что-то вроде этого: (hardcoding впереди!)

    int padding = 3;
    int maxCol0width = "Hello World!".Length;
    int maxCol1width = "90.345".Length;
    int maxCol2width = "value".Length;

    string fmt0 = "{0,-" + (maxCol0width + padding) + "}";
    string fmt1 = "{1,-" + (maxCol1width + padding) + "}";
    string fmt2 = "{2,-" + (maxCol2width + padding) + "}";

    string fmt = fmt0 + fmt1 + fmt2;

    Console.WriteLine(fmt, "Hello World!", 90.345, "value");
    Console.WriteLine(fmt, "Hi!", 1.2, "X");
    Console.WriteLine(fmt, "Another", 100, "ZZZ");

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

Ответ 6

Также обратите внимание, что вам нужно будет использовать непропорциональный шрифт для отображения, иначе ваши столбцы будут по-прежнему не выстраиваться правильно. Где вы показываете эти данные? Там могут быть лучшие способы получения табличного вывода.

Ответ 7

Я знаю, что на это уже давно дан ответ, но есть новый способ с С# 6.0

string[] one = new string[] { "1.0536", "2.1", "2" };
string[] two = new string[] { "Round", "Square", "Hex" };
string[] three = new string[] { "1.0536 Round 6061-T6", "2.1 Square T351", "2 Hex ASF.3.4.5" };

for (int i = 0; i < 3; i++) Console.WriteLine($"{one[i],-10}{two[i],-10}{three[i],-10}");

$"{one[i],-10}{two[i],-10}{three[i],-10}" - новая замена для string.format. Я нашел его очень полезным во многих моих проектах. Вот ссылка на дополнительную информацию о строковой интерполяции в С# 6.0: https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/string-interpolation