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応じて適用することです。それで、最後に使いたいです。

4

1 に答える 1

3

ユーザー名の最大長を見つけてアルゴリズムを 2 パスにするか、任意の (ただし妥当な) サイズに制限して長すぎる文字列の末尾を無条件に切り落とす必要があります。列幅を取得したら、左揃えまたは右揃えの書式文字列を使用できます。

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

また、大きなテーブルtable.concatの場合、最終出力の構築に を使用することを検討してください。文字列を繰り返し追加するよりもかなり高速です (説明については、PIL の 11.6 章を参照してください)。

于 2012-04-10T13:34:56.340 に答える