Ruby 如何解析字符串中的复杂货币值

Ruby 如何解析字符串中的复杂货币值,ruby,regex,parsing,Ruby,Regex,Parsing,我必须解析一组复杂的货币值字符串。有些特殊情况也需要考虑 下面是其中的一些(左:要分析的字符串,右:所需的返回值): 我可以拆分字符串,然后对每个特殊情况使用条件语句逻辑,但我想知道是否有一种更“抽象”的方法来解析这些字符串 更新 我检查了有一些很好的解释,但是“百万”部分遗漏了。请参阅,如果字符串为“$120万”,我知道在“.”之后总共需要6位数字(本例中为字符串数字),因此将添加4个零。如果我有218.3万美元,我知道我需要加3个零,这样“.”后面总共有6位数字 s = '"$1,950,0

我必须解析一组复杂的货币值字符串。有些特殊情况也需要考虑

下面是其中的一些(左:要分析的字符串,右:所需的返回值):

我可以拆分字符串,然后对每个特殊情况使用条件语句逻辑,但我想知道是否有一种更“抽象”的方法来解析这些字符串

更新


我检查了有一些很好的解释,但是“百万”部分遗漏了。请参阅,如果字符串为“$120万”,我知道在“.”之后总共需要6位数字(本例中为字符串数字),因此将添加4个零。如果我有218.3万美元,我知道我需要加3个零,这样“.”后面总共有6位数字

s = '"$1,950,000"          #=> "1950000
"$750,000"            #=> "750000"
"$1,433,000[2]"       #=> "1433000"
"$1.3 million"        #=> "1300000"
"$2.183 million[4]"   #=> "2183000"
"US$1,644,736 (est.)" #=> "1644736"'

s.scan(/[\$£](\d{1,3}(,\d{3})*(\.\d*)?)( hundred| thousand| million| billion)?/).each do |m|
  number = m[0].gsub(',', '').to_f
  unit = m[3]
  multiplier = 1

  if unit == ' hundred' then
    multiplier = 1e2
  elsif unit == ' thousand' then
    multiplier = 1e3
  elsif unit == ' million' then
    multiplier = 1e6
  elsif unit == ' billion' then
    multiplier = 1e9
  end

  puts number * multiplier
end
印刷品

1950000.0
750000.0
1433000.0
1300000.0
2183000.0
1644736.0

@rararake,像
s.each{s2 | s2.scan…}
一样迭代列表。这里有一个很好的工具:,如果需要更多解释,请告诉我。请参阅我的更新答案。它不处理货币转换,仍然只是提取数字。太棒了!最后一件事,它不适用于
“$55000000[1]”
我得到
55.0
而不是
55000000
1950000.0
750000.0
1433000.0
1300000.0
2183000.0
1644736.0