Конкатенация строк
Как я уже задавал в предыдущем вопросе (ссылка) о конкатенации многочастной строки переменной длины, я использовал метод, на который там ответил rkhayrov, и теперь моя функция выглядит так:
local sToReturn = string.format( "\t%03s\t%-25s\t%-7s\n\t", "S. No.", "UserName", "Score" )
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
sTemp = string.format( "%03s\t%025s\t%-7d", tostring(i), DataArray.username, DataArray.totalcount )
sToReturn = sToReturn..sTemp.."\n\t"
DataArray = SQLQuery:fetch ({}, "a")
i = i + 1
end
Но даже сейчас ценность score
все еще не выполняет заказ в соответствии с требованиями. Максимальная длина имени пользователя - 25. Я использовал %025s
внутри цикла while, потому что я хочу, чтобы имена пользователей были выровнены по правому краю, а %-25s
это сделать слово UserName
Центр оправдан.
РЕДАКТИРОВАТЬ
Токовый выход:
Требуемый выход:
Displaying the list of top 5 chit-chatters.
S. No. UserName Score
1 Keeda 9440
2 _2.2_™ 7675
3 aim 7057
4 KGBRULES 6770
5 Guddu 6322
Я думаю, что это из-за разницы в шрифтах, но так как большинство клиентов имеют шрифты по умолчанию для Windows 7 (Tahoma/Verdana в 11px), мне нужен, по крайней мере, оптимальный результат.
3 ответа
Я думаю, что это из-за разницы в шрифтах
Это. string.format
форматирует, вставляя пробел. Это работает только для шрифтов фиксированной ширины (т. Е. Все символы имеют одинаковую ширину, включая пробелы).
так как большинство клиентов имеют шрифты по умолчанию для Windows 7 (Tahoma/Verdana в 11px)
В чем? Как они просматривают ваш вывод? Вы пишете это в текстовый файл, который они затем открывают в редакторе по своему выбору (скорее всего, Блокнот)? Тогда этот подход просто не будет работать.
Не знаю достаточно о ваших требованиях к выводу, чтобы управлять вами дальше, но стоит отметить, что у всех есть браузер, поэтому вывод HTML очень переносим.
string.format не усекается - ширина поля минимальная, а не максимальная. Вам придется усечь строки до 25 символов самостоятельно с чем-то вроде DataArray.username:sub(0,25)
,
Я бы удалил вкладки из string.format; и используйте обоснование, предоставленное только%25s. Не будет идеальным, но, вероятно, будет ближе.
Используйте шрифт фиксированной ширины, если можете.