1

我正在尝试找到一个有效的正则表达式,它可以让我找到一个网页的所有价格,就像1,150.00500.00

这个正则表达式在 Rubular 中对我有用:

/(\d?,?\d+.\d+)/

但它在我的 Ruby 代码中不起作用,因为它对于数百个值是可以的,但只取千位中的第一个数字(例如,在 1,150.00 中取 1)。

有什么我想念的吗?

这是我正在使用的代码:

str_rooms_prices = rooms_container.scan(/[\d,]?\d+\.\d+\s/)

puts "This is the room prices I've found so far #{str_rooms_prices}."

str_rooms_prices = str_rooms_prices - ["0"]

puts "I'm now substracting the 0 prices and this is what remains: #{str_rooms_prices}."

int_rooms_prices = str_rooms_prices.map { |str| str.to_i }

min_price = int_rooms_prices.min.to_i

然后我得到的 min_price 是 1。

4

2 回答 2

3

我认为您的正则表达式过于复杂。在我看来/[\d,.]+/会做得很好。此外,您正在使用to_iwhich 会因为逗号而中断

'1,000,000.00'.to_i
#=> 1

所以你需要先删除这些逗号,例如String#delete

'1,000,000.00'.delete(',').to_i
#=> 1000000

另一个问题to_i是,它将丢弃小数位,因为它将数字转换为整数:

'1.23'.to_i
#=> 1

所以你应该to_f改用:

'1.23'.to_f
#=> 1.23

这是一个甚至可以处理负值的完整示例:

str = "Subtracting 1,500.00 from 1,150.23 leaves you with -350.77"
str.scan(/-?[\d,.]+/).map{|s| s.delete(',').to_f }
#=> [1500.0, 1150.23, -350.77]

如果你真的不需要小数位,to_i当然可以使用。

于 2013-07-09T15:23:18.467 回答
2

min_price由于你的转换,你得到了1 to_i

'1,150.00'.to_i
=> 1

尝试以下操作:

int_rooms_prices = str_rooms_prices.map { |str| str[0].tr(',','').to_i }

需要注意的是,您应该将价格转换为单位,否则小数位将丢失。因此,使用 将值转换为单位to_f,然后乘以 100 以获得完整值,然后您可以转换为整数。

int_rooms_prices = str_rooms_prices.map { |str| (str[0].tr(',','').to_f*100).to_i }

然后您可以使用number_to_currency显示正确的价格,如下所示:

number_to_currency(min_price/100)
于 2013-07-09T15:03:58.130 回答