Domanda

As I asked in my previous question(Link) about concatenating a multipart string of variable lengths, I used the method answered there by rkhayrov and now, my function looks like this:

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

But, even now, the value of score is still not following the order as required. The max length of username is 25. I've used %025s inside the while loop because I want the usernames to be right-justified, while the %-25s is to make the word UserName centre justified.

EDIT

Current output:

Current output!

Required Output:

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   

I think it's because of difference in fonts, but since most of the clients have Windows 7 default fonts(Tahoma/Verdana at 11px), I need optimum result for at-least that.

È stato utile?

Soluzione

I think it's because of difference in fonts

It is. string.format formats by inserting whitespace. That only works for a fixed width fonts (i.e. all characters have the same width, including whitespace).

since most of the clients have Windows 7 default fonts(Tahoma/Verdana at 11px)

In what? How are they viewing your output? Do you write it to a textfile, that they then open in the editor of their choice (likely Notepad)? Then this approach will simply not work.

Don't know enough about your output requirements to steer you any futher, but it's worth noting that everyone has a browser so HTML output is very portable.

Altri suggerimenti

string.format doesn't truncate - the width of the field is minimum, not maximum. You'll have to truncate the strings to 25 characters yourself with something like DataArray.username:sub(0,25).

I'd remove the tabs from the string.format; and use the justification provided by %25s only. Won't be perfect but will probably be closer.

Use a fixed-width font if you can.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top