Конкатенация строк

Как я уже задавал в предыдущем вопросе (ссылка) о конкатенации многочастной строки переменной длины, я использовал метод, на который там ответил 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. Не будет идеальным, но, вероятно, будет ближе.

Используйте шрифт фиксированной ширины, если можете.

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