Я переписываю старый инструмент (исходного кода которого у меня нет), и одной из его функций является печать списка имен файлов, соответствующих его идентификатору.
Моя цель - получить этот результат:
0 0x1A00000F
AAAAAAAAAAA 0x1A00000C
AAAAAAAAAAAAAAAAAAAA 0x1A000007
BBBBBBBBBBBBBBBBBBBBBBBBB 0x1A00000D
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 0x1A00000D
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 0x1A00000E
но я получаю такой результат:
0 0x1A00000F
AAAAAAAAAAA 0x1A00000C
AAAAAAAAAAAAAAAAAAAA0x1A000007
BBBBBBBBBBBBBBBBBBBBBBBBB0x1A00000D
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB0x1A00000D
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC0x1A00000E
Идея состоит в том, чтобы сделать это, используя строковый формат, но результат не ожидаемый, я использую следующий код:
for(int i = 0; i < files.Length; i++)
{
string FileLabel = files[i];
ws.WriteLine("{0,-14}{1}", FileLabel, GetHexNumber(0x1A000000 + i));
}
Идея состоит в том, чтобы использовать пробелы между «частью A» и «частью B», а не табуляциями. Оригинальный инструмент, который печатает этот список, кажется, что его логика заключается в том, что, когда часть A находится на расстоянии одного символа от части B, добавляется 14 пробелов, но я не уверен, как я могу это сделать или смогу ли я сделать это с помощью string.format.
Как я могу получить этот результат?
да, именно это
Мы не размещаем здесь изображения результатов.
Для этого вы можете использовать PadLeft/PadRight:
for(int i = 0; i < files.Length; i++)
{
string fileLabel = files[i];
int pos = 6 + 14 * (int)((fileLabel.Length + 8) / 14);
ws.WriteLine("{0}{1}", fileLabel.PadRight(pos),
GetHexNumber(0x1A000000 + i));
}
Здесь переменная int pos
— это позиция второго поля и используется для определения количества пробелов, которые необходимо добавить в первое поле.
Поскольку второй столбец всегда начинается с 14n + 6 символов для некоторого целого числа n, мы можем вычесть 6 из длины строки в первом столбце, найти наименьшее кратное 14, которое строго больше этого числа, и прибавить 6 обратно. Это дает нам представление о том, где должен начинаться второй столбец.
string Format(string col1, string col2) {
var padLength = NextMultipleOf14(col1.Length - 6) + 6;
return col1.PadRight(padLength) + col2;
}
int NextMultipleOf14(int x) {
if (x < 0) return 0;
if (x % 14 == 0) return x + 14;
return x + (14 - x % 14);
}
Использование:
// assuming GetHexNumber returns a string
Format(FileLabel, GetHexNumber(0x1A000000 + i))
Вроде есть «слоты», с которых начнется второй столбец, в 14n+6 символов. И соответствующий слот будет выбран в зависимости от длины первого столбца. Я правильно понял?