我正在生成一个向控制台输出信息的脚本.信息是某种具有价值的统计数据.就像哈希一样.
所以一个值的名称可能是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的值.
小智 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)
| 归档时间: |
|
| 查看次数: |
69677 次 |
| 最近记录: |