【问题标题】:Converting hash ruby objects to positive currency将哈希红宝石对象转换为正货币
【发布时间】:2015-06-09 20:06:21
【问题描述】:

我有一个哈希,其中键是月份,我想将对象转换为正数和货币。

输入

hash = {
  12 => -5888.969999999999,
  4 => -6346.1,
  3 => -6081.76,
  2 => -5774.799999999999,
  1 => -4454.38
}

输出

hash = {
    12 => 5888.96,
    4 => 6346.10,
    3 => 6081.76,
    2 => 5774.79,
    1 => 4454.38
}

#Output should be a float

任何帮助将不胜感激。

【问题讨论】:

  • 请期待输出
  • 您的输出语法无效 - 值是字符串还是 BigDecimals 还是什么?
  • Numeric.abs() 可用于确保数字为正数,而 Float.round(2) 会将浮点数四舍五入到小数点后 2 位。有关用法示例,请参阅 ruby-doc.org/core-2.1.4/Numeric.html#method-i-absruby-doc.org/core-2.2.2/Float.html#method-i-round
  • 所以 abs 方法有效,但我不能使用浮点数,因为某些对象已经在小数点后有 1 位数字并且会引发错误
  • 我将问题更新为浮点数

标签: ruby-on-rails ruby hash currency


【解决方案1】:

试试

hash.transform_values{|v| v.round(2).abs()}

hash.update(hash){|k,v| v.round(2).abs()}

【讨论】:

  • “错误”对试图帮助诊断的人没有帮助——错误是什么。
  • NoMethodError: undefined method `transform_values' for #<0x54ce4f27>
【解决方案2】:

Numeric.abs() 可用于确保数字为正数,而 Float.round(2) 会将浮点数四舍五入到小数点后 2 位。有关用法示例,请参见 ruby​​-doc.org/core-2.1.4/Numeric.html#method-i-abs 和 ruby​​-doc.org/core-2.2.2/Float.html#method-i-round。请注意,round() 不会添加尾随零,因为这不会影响数值,但是可以通过格式化添加尾随零,例如:

hash = {
  12 => -5888.969999999999,
  4 => -6346.1,
  3 => -6081.76,
  2 => -5774.799999999999,
  1 => -4454.38
}

# transform hash values
hash.each do |key, value|
  hash[key] = value.abs().round(2)
end

# print the modified hash without formatting the values
hash.each do |key, value|
  puts "#{key} => #{value}"
end

# prints 
# 12 => 5888.97
# 4 => 6346.1
# 3 => 6081.76
# 2 => 5774.80
# 1 => 4454.38

# print hash with values formatted with precision of 2 digits
hash.each do |key, value|
  puts "#{key} => #{'%.2f' % value}"
end

# prints
# 12 => 5888.97
# 4 => 6346.10
# 3 => 6081.76
# 2 => 5774.80
# 1 => 4454.38

【讨论】:

  • 我发现.round(2) 仍然可以有84.0 之类的输出。 2018 年 6 月 5 日,Ruby 2.5.1.
猜你喜欢
  • 2013-11-12
  • 2015-09-16
  • 2019-04-05
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
相关资源
最近更新 更多