Объединить строки переменной длины в виде таблицы
Я извлекаю массив данных из SQL, а затем объединяю их в виде строк для отображения. Функция выглядит так:
function FetchTopStats( Conn, iLimit )
local sToReturn = "\tS.No. \t UserName \t Score\n\t"
SQLQuery = assert( Conn:execute( string.format( [[SELECT username, totalcount FROM chatstat ORDER BY totalcount DESC LIMIT %d]], iLimit ) ) )
DataArray = SQLQuery:fetch ({}, "a")
i = 1
while DataArray do
sToReturn = sToReturn..tostring( i ).."\t"..DataArray.username.." \t "..DataArray.totalcount.."\n\t"
DataArray = SQLQuery:fetch ({}, "a")
i = i + 1
end
return sToReturn
end
Это дает мне вывод, как:
S.No. UserName Score
1 aim 6641
2 time 5021
3 Shepard 4977
и так далее. Я думаю об использовании string.format
функция, чтобы иметь дисплей следующим образом:
S.No. UserName Score
1 aim 6641
2 time 5021
3 Shepard 4977
Но у меня совершенно нет идей о том, как это сделать. Единственный вариант, который мне приходит в голову, - это проверка длины строки имени пользователя, а затем применение \t
соответственно. Это я хочу использовать в самом конце.
1 ответ
Что ж, вам нужно либо определить максимальную длину имени пользователя, что делает алгоритм 2-проходным, либо ограничить его произвольным (но разумным) размером и безоговорочно отрубить хвосты слишком длинных строк. Если у вас есть ширина столбца, вы можете использовать строки формата по левому или правому краю:
> print(string.format("|%-10d|%-20s|%10d|", 1, "Shepard", 9000))
|1 |Shepard | 9000|
Кроме того, для больших таблиц рассмотрите возможность использования table.concat
для построения конечного результата: это значительно быстрее, чем многократное добавление строк (для объяснения обратитесь к Главе 11.6 PIL).