Форматирование текстовых столбцов динамического размера

Я переписываю старый инструмент (исходного кода которого у меня нет), и одной из его функций является печать списка имен файлов, соответствующих его идентификатору.

Моя цель - получить этот результат:

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.

Как я могу получить этот результат?

Вроде есть «слоты», с которых начнется второй столбец, в 14n+6 символов. И соответствующий слот будет выбран в зависимости от длины первого столбца. Я правильно понял?

Sweeper 09.08.2024 13:08

да, именно это

jms2505 09.08.2024 13:32

Мы не размещаем здесь изображения результатов.

Joel Coehoorn 09.08.2024 15:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Для этого вы можете использовать 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))

Другие вопросы по теме

Похожие вопросы

Как лучше всего использовать вспомогательный класс в ASP.NET Core, который можно использовать во всех представлениях?
Сопоставление объектов в ASP.NET Core с помощью C#
Есть ли способ обновить только объект DI (сервер Blazor)
Удаление строки из базы данных SQL Server в ASP.NET MVC
Получить за один вызов всех пользователей в группе, а также количество групп, к которым принадлежит каждый пользователь?
Как правильно зарегистрировать и запустить процессор служебной шины Azure в службе приложений Azure
JsonNode.HasProperty возвращает false, если значение равно нулю
AWS SDK: значение не может быть нулевым. Имя параметра: Свойство Options не может быть пустым: ClientName
Использование дженериков в C# для определения подсвойства для десериализации JSON завершается неудачей из-за странности конструктора
System.Text.Json Десериализовать вложенный полиморфный объект без дискриминатора типа