与Ruby的number_to_human相反

时间:2017-05-19 20:53:06

标签: ruby-on-rails ruby rubygems

希望使用以这些格式存储金额的字符串数据集。例如:

  

$ 217.3M

     

$ 16亿

     

$ 34M

     

€1M

     

€2.8B

我查看了money宝石,但看起来它不像处理“M,B,k”的数字。寻找能做到这一点的宝石,以便我可以转换汇率并比较数量。我需要与number_to_human方法相反的方法。

2 个答案:

答案 0 :(得分:2)

我会从这样的事情开始:

MULTIPLIERS = { 'k' => 10**3, 'm' => 10**6, 'b' => 10**9 }

def human_to_number(human)
  number = human[/(\d+\.?)+/].to_f
  factor = human[/\w$/].try(:downcase)

  number * MULTIPLIERS.fetch(factor, 1)
end

human_to_number('$217.3M')  #=> 217300000.0
human_to_number('$1.6B')    #=> 1600000000.0
human_to_number('$34M')     #=> 34000000.0
human_to_number('€1M')      #=> 1000000.0
human_to_number('€2.8B')    #=> 2800000000.0

human_to_number('1000')     #=> 1000.0
human_to_number('10.88')    #=> 10.88

答案 1 :(得分:0)

如果其他人想要这个,我决定不要懒惰并且实际上写自己的功能:

def text_to_money(text)
  returnarray = []
  if (text.count('k') >= 1 || text.count('K') >= 1)
    multiplier = 1000
  elsif (text.count('M') >= 1 || text.count('m') >= 1)
    multiplier = 1000000
  elsif (text.count('B') >= 1 || text.count('b') >= 1)
    multiplier = 1000000000
  else
    multiplier = 1
  end

  num = text.to_s.gsub(/[$,]/,'').to_f
  total = num * multiplier

  returnarray << [text[0], total]

  return returnarray
end

感谢您的帮助!