很好地将输出格式化为控制台,指定选项卡的数量

54 ruby formatted

我正在生成一个向控制台输出信息的脚本.信息是某种具有价值的统计数据.就像哈希一样.

所以一个值的名称可能是8个字符长,另一个值是3.当我循环输出信息时,有两个\ t\t\t \n某些列未正确对齐.

例如,输出可能是这样的:

long value name          14
short              12
little             13
tiny               123421
long name again          912421
Run Code Online (Sandbox Code Playgroud)

我希望所有值都正确排列.现在我这样做:

puts "#{value_name} - \t\t #{value}"
Run Code Online (Sandbox Code Playgroud)

我怎么能说长名,只使用一个标签?还是有其他解决方案吗?

Lar*_*eth 56

如果您知道最大长度不超过20个字符:

printf "%-20s %s\n", value_name, value
Run Code Online (Sandbox Code Playgroud)

如果你想让它更具动感,那么这样的东西应该很好用:

longest_key = data_hash.keys.max_by(&:length)
data_hash.each do |key, value|
  printf "%-#{longest_key.length}s %s\n", key, value
end
Run Code Online (Sandbox Code Playgroud)


nik*_*nik 23

通常有%10s一种printf格式很好的方案.
但是,我根本没有使用红宝石,所以你需要检查一下.


是的,有格式化的printf.
上面的例子应该在10个字符的空间中正确对齐.
您可以根据列中最宽的字段进行格式化.

printf([port,] format,arg ...)

打印根据sprintf等格式格式化的参数.如果第一个参数是IO或其子类的实例,则打印重定向到该对象.默认值是$ stdout的值.

  • 记得[printf(*args)](http://apidock.com/ruby/Kernel/printf)有一个[字符串#的实现](http://ruby-doc.org/docs/ProgrammingRuby/html/ref_c_string .html#String._pc):%:`"%s%10s"%[value_name,value]`看起来很棒.无论如何,不​​要用大的术语破坏你的代码! (3认同)
  • printf("% - 10s%10s",args)诀窍......非常感谢! (2认同)

小智 14

字符串有一个内置的ljust正是这样的:

x = {"foo"=>37, "something long"=>42, "between"=>99}
x.each { |k, v| puts "#{k.ljust(20)} #{v}" }
# Outputs:
#  foo                  37
#  something long       42
#  between              99
Run Code Online (Sandbox Code Playgroud)

或者,如果你想要标签,你可以做一些数学运算(假设标签显示宽度为8)并写一个简短的显示功能:

def tab_pad(label, tab_stop = 4)
  label_tabs = label.length / 8
  label.ljust(label.length + tab_stop - label_tabs, "\t")
end

x.each { |k, v| puts "#{tab_pad(k)}#{v}" }
# Outputs: 
#  foo                  37
#  something long       42
#  between              99
Run Code Online (Sandbox Code Playgroud)


ser*_*ych 10

之前几乎没有bug,但现在你可以使用%operator的大部分printf语法:

1.9.3-p194 :025 > " %-20s %05d" % ['hello', 12]
 => " hello                00012" 
Run Code Online (Sandbox Code Playgroud)

当然你也可以使用预先计算的宽度:

1.9.3-p194 :030 > "%-#{width}s %05x" % ['hello', 12]
  => "hello          0000c" 
Run Code Online (Sandbox Code Playgroud)