Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何将Rails中的字符串(“289,95”)转换为浮点(“289.95”)? 上下文_Ruby On Rails_Ruby_Regex - Fatal编程技术网

Ruby on rails 如何将Rails中的字符串(“289,95”)转换为浮点(“289.95”)? 上下文

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

我将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: #, 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”这样的价值观扼杀。这是对一个完全不同的问题的一个很好的回答。这确实是我最初尝试失败的原因。谢谢。这是对一个完全不同的问题的一个很好的回答。这确实是我最初尝试失败的原因。非常感谢。