2012-04-10 30 views
0

我從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。那,我想最後使用。

回答

3

那麼,你需要找出用戶名的最大長度,從而使算法2遍,或限制到一些任意(但合理)的大小,並無條件地切斷過長的字符串的尾巴。一旦你的列寬,可以使用左或右對齊格式字符串:

> print(string.format("|%-10d|%-20s|%10d|", 1, "Shepard", 9000)) 
|1   |Shepard    |  9000| 

此外,對於大表考慮使用table.concat建設的最終輸出:這是大大高於反覆追加字符串(指Chapter 11.6 of PIL爲解釋)。

相關問題