Ruby on rails 如何将Rails中的字符串(“289,95”)转换为浮点(“289.95”)? 上下文
我将Rails(4.0.1+Ruby 2.0.0)连接到一个PostgreSQL数据库,数据库中填充了诸如“289,95欧元”之类的字符串。这些值是使用Nokogiri从网站上获取的。我想把字符串转换成浮点 我试过的 Rails控制台:Ruby on rails 如何将Rails中的字符串(“289,95”)转换为浮点(“289.95”)? 上下文,ruby-on-rails,ruby,regex,Ruby On Rails,Ruby,Regex,我将Rails(4.0.1+Ruby 2.0.0)连接到一个PostgreSQL数据库,数据库中填充了诸如“289,95欧元”之类的字符串。这些值是使用Nokogiri从网站上获取的。我想把字符串转换成浮点 我试过的 Rails控制台: listing = Listing.find(1) => #<Listing id: 1, title: #, subtitle: #, name: #, price: "€ 289,95", url: #, created_at: #, updat
listing = Listing.find(1)
=> #<Listing id: 1, title: #, subtitle: #, name: #, price: "€ 289,95", url: #, created_at: #, updated_at: #>
listing_price = listing.price
=> "€ 289,95"
listing_price_1 = listing_price.gsub(/,/, ".")
=> "€ 289.95"
listing_price_2 = listing_price_1.gsub(/€\s/, "")
=> "€ 289.95"
listing_price_3 = listing_price_2.to_f
=> 0.0
listing=listing.find(1)
=> #
listing_price=listing.price
=> "€ 289,95"
listing_price_1=listing_price.gsub(/,/,“)
=> "€ 289.95"
listing_price_2=listing_price_1.gsub(/€\s/,“”)
=> "€ 289.95"
挂牌价格3=挂牌价格2.to
=> 0.0
问题
代码在irb
中工作,但在rails控制台中不工作
我想知道的是
如何在Rails中将字符串“€289,95”
转换为浮点“289.95”
?您的技术失败的步骤是尝试使用regexp/€/s/
剥离€/289.95>和€/code>中的空格,但这不匹配,使字符串保持不变
"€ 289,95".sub(/\A\D+/, "").sub(",", ".").to_f
# => 289.95
€289,95
中的空格字符可能是一个不间断的空格(U+00A0),而不是一个“普通”空格,并将在网页中使用,以便€
和值不会分开
在Ruby中,regexp中的\s
不匹配非中断空格,因此对gsub
的调用不会替换任何内容:
2.0.0p353:001>s=“€\u00a0289.95”
=> "€ 289.95"
2.0.0p353:002>s.gsub(/€\s/,“”)
=> "€ 289.95"
非中断空格由[[:space:]
匹配,或由\{Blank}
匹配:
2.0.0p353:003>s.gsub/€[:space:][]/,“
=> "289.95"
2.0.0p353:004>s.gsub/€\p{Blank}/,“
=> "289.95"
因此,如果您想要一个比中更具体的regexp,您可以使用其中的一个。您的技术失败的步骤是尝试将€
和€289.95
中的空间与regexp/€\s/
剥离,但这不匹配,保留字符串不变
listing.price.delete('€ ') # => "289,95"
listing.price.delete('€ ').tr(',', '.') # => "289.95"
listing.price.delete('€ ').tr(',', '.').to_f # => 289.95
€289,95
中的空格字符可能是一个不间断的空格(U+00A0),而不是一个“普通”空格,并将在网页中使用,以便€
和值不会分开
在Ruby中,regexp中的\s
不匹配非中断空格,因此对gsub
的调用不会替换任何内容:
2.0.0p353:001>s=“€\u00a0289.95”
=> "€ 289.95"
2.0.0p353:002>s.gsub(/€\s/,“”)
=> "€ 289.95"
非中断空格由[[:space:]
匹配,或由\{Blank}
匹配:
2.0.0p353:003>s.gsub/€[:space:][]/,“
=> "289.95"
2.0.0p353:004>s.gsub/€\p{Blank}/,“
=> "289.95"
因此,如果您想要一个比中更具体的regexp,您可以使用其中的一个
listing.price.delete('€ ') # => "289,95"
listing.price.delete('€ ').tr(',', '.') # => "289.95"
listing.price.delete('€ ').tr(',', '.').to_f # => 289.95
字符串的“delete”方法适用于删除所有出现的目标字符串。
“tr”方法需要搜索一个字符串,并使用一个字符串替换它们
字符串的“delete”方法适用于删除所有出现的目标字符串。
而“tr”方法需要搜索一个字符串,并用一个字符串替换它们。比公认的答案更好的可能是:
"€ 289,95"[/[\d,.]+/].tr ',', '.'
比公认的答案更好的可能是:
"€ 289,95"[/[\d,.]+/].tr ',', '.'
listing_price_1.gsub(/€\s/,“”)
-留下垃圾。最快、最脏的方法可能是:gsub(/,/,“).gsub(/[^\d.]/,”).to_f
。。但这确实是一种愚蠢的、不支持区域设置的货币处理方法,它会在一些简单的问题上出现突破,比如$1200
(例如美国)。那么你有什么建议吗?没有答案,但请注意最近(11/22)有一个漏洞和浮点解析的热修复程序:无论如何,我怀疑由于Unicode/编码问题,它不起作用。。但我不知道该去哪里照顾它。我提出的“解决方案”通过不直接选择欧元符号来避免此问题。@user2864740我使用Nokogiri来刮取数据。我可能无法在Nokogiri中选择带有regexp的€
。清单\u price\u 1.gsub(/€\s/,“”)
-留下垃圾。最快、最脏的方法可能是:gsub(/,/,“).gsub(/[^\d.]/,”).to_f
。。但这确实是一种愚蠢的、不支持区域设置的货币处理方法,它会在一些简单的问题上出现突破,比如$1200
(例如美国)。那么你有什么建议吗?没有答案,但请注意最近(11/22)有一个漏洞和浮点解析的热修复程序:无论如何,我怀疑由于Unicode/编码问题,它不起作用。。但我不知道该去哪里照顾它。我提出的“解决方案”通过不直接选择欧元符号来避免此问题。@user2864740我使用Nokogiri来刮取数据。我可能无法在Nokogiri中选择带有regexp的€
。它将提取第一个类似价格的表达式并进行转换。其他人会被诸如“12”之类的值扼杀——好吧,它将提取第一个类似价格的表达式并转换它。其他人会被诸如“12”这样的价值观扼杀。这是对一个完全不同的问题的一个很好的回答。这确实是我最初尝试失败的原因。谢谢。这是对一个完全不同的问题的一个很好的回答。这确实是我最初尝试失败的原因。非常感谢。