1

Webページのすべての価格を見つけることができる、機能する正規表現を見つけようとしています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_iコンマのために破損するものを使用しています

'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_f100 を掛けて完全な値を取得すると、整数に変換できます。

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 に答える