2

我正在使用以下哈希在 PDF 中创建一个表:

percentages = {
"group one" => 0.2,
"group two" => 0.6666666666666666,
"group three" => 0.2,
"group four" => 0.03333333333333333,
"group five" => 0.03333333333333333,
"group six" => 0.06666666666666667
}

我正在调用.transpose哈希键和值:

[percentages.keys, percentages.values].transpose

这按预期工作,但我现在需要将小数转换为百分比。而不是.2,我需要显示 20%。而不是0.06666666666666667,我需要显示 7%。

有没有一种干净的方法可以在不改变原始哈希/创建新哈希的情况下做到这一点?

4

4 回答 4

4

你可以试试

[percentages.keys, percentages.values.map {|x| (x * 100).round.to_s + '%'}].transpose

它简单地将每个值乘以 100(转换为百分比),调用round(删除小数,即6.666667 -> 7),然后调用to_s将其转换为字符串并连接到'%'.

于 2013-10-20T22:41:06.563 回答
3
percentages.map{|k, v| [k, "#{(v * 100).round}%"]}
于 2013-10-20T23:10:46.457 回答
2

另一种方式,使用 zip 而不是转置:

percentages.keys.zip percentages.values.map {|v| "#{(100*v).round.to_s}%"}
  #  => [["group one", "20%"], ["group two", "67%"], ["group three", "20%"],
  #      ["group four", "3%"], ["group five", "3%"], ["group six", "7%"]] 
于 2013-10-20T23:11:26.257 回答
0

一种方便的转换和舍入使用String.%的方法,类似于formatprintfsprintf在内核中:

[
  0.2,
  0.6666666666666666,
  0.2,
  0.03333333333333333,
  0.06666666666666667
].each do |f|
  puts "%.0f%%" % (f * 100)
end
# >> 20%
# >> 67%
# >> 20%
# >> 3%
# >> 7%

从那时起,很容易构建您正在寻找的其余部分。

于 2013-10-21T00:14:56.423 回答