2017-02-08 35 views
1

我正在打印每行開頭的行號數組中的值。我想要改變間距以確保數值垂直排列,而不管數組的大小如何。如何根據整數中的位數更改空格數?

@lines.each_with_index {|l,i| 
    newtext = l[:text] 
    space = ' ' * @lines.size.to_s.size 
    cur_space = i.to_s.size 
    (1..cur_space).each { space.chop! } 

    puts "\##{i}#{space} #{newtext}" 
} 

輸出

#0 blah 
#1 blah 
#2 blah 
#3 blah 
#4 blah 
#5 blah 
#6 blah 
#7 blah 
#8 blah 
#9 blah 
#10 blah 
#11 blah 
#12 blah 
#13 blah 

這工作,但我不知道是否有更好的方法來做到這一點?

回答

5

您正在尋找String#ljust

index_size = @lines.size.pred.to_s.size 

@lines.each_with_index do |line, index| 
    puts "##{index.to_s.ljust(index_size)} #{line[:text]}" 
end 
+2

似乎是最好的答案。如果你使用ruby2.4或更高版本,我會使用'@ lines.size.pred.digits.count' –

2

您可以使用標籤:

2.2.4 :001 > class Tabs 
2.2.4 :002?> def self.do_it 
2.2.4 :003?>  (1..13).each do |number| 
2.2.4 :004 >   puts "##{number}\tblah" 
2.2.4 :005?>  end 
2.2.4 :006?>  end 
2.2.4 :007?> end 
=> :do_it 
2.2.4 :008 > Tabs.do_it 
#1 blah 
#2 blah 
#3 blah 
#4 blah 
#5 blah 
#6 blah 
#7 blah 
#8 blah 
#9 blah 
#10 blah 
#11 blah 
#12 blah 
#13 blah 
+0

聰明。它不適用於巨大的ID,但它可能不是問題。 –

2

你也可以使用format"%-3d"

  • -:左對齊這種轉換的結果。

  • d:將參數轉換爲十進制數。


n  = 14 
width = (n-1).to_s.size 
pattern = "#%-#{width}d %s" 

n.times do |i| 
    puts format(pattern, i, 'blah') 
end 

它輸出:

#0 blah 
#1 blah 
#2 blah 
#3 blah 
#4 blah 
#5 blah 
#6 blah 
#7 blah 
#8 blah 
#9 blah 
#10 blah 
#11 blah 
#12 blah 
#13 blah 
相關問題