如何在哈希中将BigDecimals的值打印为to_s

时间:2014-07-14 21:16:33

标签: ruby

我有一个哈希x。我想打印哈希x,但对于那些BigDecimal的值,我想打印他们的to_s转换。我需要一个表达式来返回一个字符串;它不能是puts中的一系列单独的printloop。也许与join。我可以在一行左右轻松完成这项工作吗?

5 个答案:

答案 0 :(得分:2)

由于您尚未指定要将结果加入的字符串,因此我假设您要加入"",这是默认值。 join会自动应用to_s

puts x.values.grep(BigDecimal).join

我可能误解了这个问题,因为它不清楚。如果您要打印所有值,但将to_s应用于某些值,则不需要特殊操作,因为join会自动应用to_s

puts x.values.join

答案 1 :(得分:1)

X.each do |key, value|
   value.class == BigDecimal ? puts value.to_s : puts value
end

X.each { |key, value | value.class == BigDecimal ? puts value.to_s : puts value }

查看三元运算符。

编辑:

同样关于您编辑的问题,请求一个字符串:

new_array = X.map {|object| object.class == BigDecimal ? object.to_s : object }然后将其转换为new_array.join("")

的字符串

答案 2 :(得分:0)

迭代所有键/​​值对并执行简单的类型检查:

X.each do |k, v|
  v.is_a?(BigDecimal) ?  puts v.to_s : puts v
end

您也可以使用is_a?代替instance_of?

修改

要符合 新要求 ,请先使用mapvalues构建一个数组:

strArr = X.values.map { | v | v.is_a?(BigDecimal) ?  v.to_s : v }

现在使用join

从数组创建一个字符串
myStr = strArr.join("[SEPARATING CHARACTER]")

答案 3 :(得分:0)

以前的答案可以很好地打印值,但不会像OP请求那样返回单个字符串。我建议使用map首先将结果值放在数组中,然后使用连接(使用您选择的分隔符)。

    values_array = x.map{ |k,v| v.is_a?(BigDecimal) ? v.to_s : v }
    values_string = values_array.join(",")

您也可以在地图块的末尾执行.join方法,但为了清晰起见,我认为我会将其分开。

答案 4 :(得分:0)

这就是我想要的:

"{" + (x.map {|key, value| "#{key}: #{value.is_a?(BigDecimal) ? value.to_s("F") : value}" }).join(", ") + "}"