Indent strings(make them lined up)

Hi,

I am newbie in Ruby. I have a question about indenting string.

there is strings like below:

www.google.com => 123.123.123.12
www.ibm.com => 123.112.123.12
www.iowahawkeyes => 123.123.112.12

i want to make above like next

www.google.com => 123.123.123.12
www.ibm.com => 123.112.123.12
www.iowahawkeyes => 123.123.112.12

original code was

puts (dns + " => " + ip)

I tried next code

puts (dns + " "*(20 - dns.length) + " = > " + ip)

but it did not work well. please teach me how to do it.

On Dec 7, 11:26 pm, Jon K. [email protected] wrote:

www.google.com => 123.123.123.12www.ibm.com => 123.112.123.12www.iowahawkeyes => 123.123.112.12

original code was

puts (dns + " => " + ip)

I tried next code

puts (dns + " "*(20 - dns.length) + " = > " + ip)

but it did not work well. please teach me how to do it.

“%-30s %s” % [dns, ip]

Thomas S. wrote:

On Dec 7, 11:26�pm, Jon K. [email protected] wrote:

www.google.com� � => 123.123.123.12www.ibm.com� � � �=> 123.112.123.12www.iowahawkeyes� => 123.123.112.12

original code was

puts (dns + " => " + ip)

I tried next code

puts (dns + " �"*(20 - dns.length) + " = > " + ip)

but it did not work well. please teach me how to do it.

“%-30s %s” % [dns, ip]

Thomas’s suggestion of String Format (%) is correct, just revising
example to reflect the original code above.

puts “%-20s => %s” % [dns, ip]

Jon K. wrote:

i want to make above like next
I tried next code

puts (dns + " "*(20 - dns.length) + " = > " + ip)

but it did not work well. please teach me how to do it.

You could do

puts “#{dns.ljust(20)} => #{ip}”

-Justin

2009/12/8 Steve W. [email protected]:

puts (dns + " �"*(20 - dns.length) + " = > " + ip)

but it did not work well. please teach me how to do it.

“%-30s %s” % [dns, ip]

Thomas’s suggestion of String Format (%) is correct, just revising
example to reflect the original code above.

puts “%-20s => %s” % [dns, ip]

I’d prefer printf in that case

printf “%-20s => %s\n”, dns, ip

Cheers

robert

Jon K. wrote:

i want to make above like next
I tried next code

puts (dns + " "*(20 - dns.length) + " = > " + ip)

but it did not work well. please teach me how to do it.

data =
%w(blip bleeping rob_the_fraud tor what-pompous-verbosity dreadful).
map{|s| [s + ‘.com’, (1…4).map{rand 256}.join(‘.’)] }

width = data.map{|a,b| a.size}.max

puts data.map{|a,b| [a.ljust(width),b].join " => " }

=== output ===

blip.com => 249.7.84.219
bleeping.com => 14.120.94.124
rob_the_fraud.com => 252.63.171.160
tor.com => 173.239.40.90
what-pompous-verbosity.com => 56.61.184.48
dreadful.com => 31.56.145.209

On Dec 9, 2009, at 3:55 AM, W. James wrote:

width = data.map{|a,b| a.size}.max
what-pompous-verbosity.com => 56.61.184.48
dreadful.com => 31.56.145.209

So you missed the phrase “please teach me how to do it” from the OP,
huh?

Sorry that you’re offended by my distinction between a request to
“teach me” versus “show me”.

I hope Jon K. [email protected] gets something from all the
responses.

-Rob

Rob B. http://agileconsultingllc.com
[email protected]

On Dec 8, 2009, at 5:11 AM, Justin C. wrote:

-Justin

OK, I’m going to go out on a limb and presume that you obtain the
successive dns and ip values from some sort of data structure. I’m
going to further assume a hash since you’re using the association
syntax in your output string, but feel free to generalize the parts of
this code that handle that iteration.

irb> my_data = {
?> ‘www.google.com’ => ‘216.68.119.70’,
?> ‘www.ibm.com’ => ‘129.42.60.216’,
?> ‘www.iowahawkeyes.com’ => ‘199.108.163.135’,
?> }
=> {“www.google.com”=>“216.68.119.70”, “www.ibm.com”=>“129.42.60.216”,
www.iowahawkeyes.com”=>“199.108.163.135”}
irb> width = my_data.keys.inject(0) {|wmax,dns| [dns.length, wmax].max }
=> 20
irb> my_data.each do |dns,ip|
?> puts “%-*s => %s”%[width, dns, ip]
irb> end
www.google.com => 216.68.119.70
www.ibm.com => 129.42.60.216
www.iowahawkeyes.com => 199.108.163.135
=> {“www.google.com”=>“216.68.119.70”, “www.ibm.com”=>“129.42.60.216”,
www.iowahawkeyes.com”=>“199.108.163.135”}
irb>
?> my_data[‘www.letmegooglethatforyou.com’] = ‘209.20.88.2’
=> “209.20.88.2”
irb>
?> width = my_data.keys.inject(0) {|wmax,dns| [dns.length,
wmax].max }
=> 29
irb> my_data.each do |dns,ip|
?> puts “#{dns.ljust(width)} => #{ip}”
irb> end
www.google.com => 216.68.119.70
www.ibm.com => 129.42.60.216
www.letmegooglethatforyou.com => 209.20.88.2
www.iowahawkeyes.com => 199.108.163.135
=> {“www.google.com”=>“216.68.119.70”, “www.ibm.com”=>“129.42.60.216”,
www.letmegooglethatforyou.com”=>“209.20.88.2”,
www.iowahawkeyes.com”=>“199.108.163.135”}

You could also put a limit on the width of the column so that one long
value doesn’t “win” or analyze the widths for some other property
(like rounding up to a multiple of 4 or something).

-Rob

Rob B. http://agileconsultingllc.com
[email protected]