我在编写一个程序,其中给乘法系统2个输入,即列数和行数。但是,当数字较大(2位数字)时,会使系统不对齐。
代码没有错。我想要的只是使“ |”垂直对齐。
我希望输出为
| 3 | 6 | 9 |
| 4 | 8 | 12 |
| 6 | 12 | 18 |
但是我得到了输出;
| 3 | 6 | 9 |
| 4 | 8 | 12 |
| 6 | 12 | 18 |
答案 0 :(得分:1)
arr = [3, 6, 9, 4, 8, 12, 6, 12, 18]
nrows = 3
width = arr.minmax.map { |n| n.to_s.size }.max
#=> 2
puts arr.each_slice(nrows).map { |row| '| ' +
row.map { |n| "%-#{width}d" % n }.join(' | ') + ' |' }
| 3 | 6 | 9 |
| 4 | 8 | 12 |
| 6 | 12 | 18 |
也许您希望右调整:
puts arr.each_slice(nrows).map { |row| '| ' +
row.map { |n| "%#{width}d" % n }.join(' | ') + ' |' }
| 3 | 6 | 9 |
| 4 | 8 | 12 |
| 6 | 12 | 18 |
有关格式设置指令,请参见Kernel#sprintf。如果知道arr
的所有元素都是非负数,我们可以这样写:
width = arr.max.to_s.size
#=> 2
如果您希望将每一列尽可能地窄,请适当调整,可以执行以下操作。
arr = [3, 6, 9, 4, -81, 12, 6, 12, 1800]
nrows = 3
col_widths = nrows.times.map { |i|
(i..nrows*nrows-1).step(3).map { |j| arr[j].to_s.size }.max }
#=> [1, 3, 4]
puts arr.each_slice(nrows).map { |row| '| ' +
row.map.with_index { |n,i| "%#{col_widths[i]}d" % n }.join(' | ') + ' |' }
| 3 | 6 | 9 |
| 4 | -81 | 12 |
| 6 | 12 | 1800 |