2013-09-28 49 views
-2

我试图从字符串'(3)'获取整数。然而方法to_i返回0。 似乎括号引用引起的问题,但我不明白原因。Ruby - 解析'(3)'为整数返回0

'3'.to_i => 3 
(3).to_i => 3 
'(3)'.to_i => 0 

为什么会发生,以及如何解决它?谢谢!

回答

2

String#to_i忽略尾随(非数字)字符:

"3foo".to_i   #=> 3 
"3)".to_i         #=> 3 

领导(非数字)字符不工作,返回0

"foo3".to_i   #=> 0 
"(3".to_i         #=> 0 

您可以使用常规提取整数部分表达:

"(3)"[/-?\d+/]  #=> "3" 

并转换其为一个整数:

"(3)"[/-?\d+/].to_i #=> 3 
1

(3)是一个表达式,而不是一个字符串;它评估为号码3

'3'是一个字符串文字,它不计算为任何数字,但可以使用to_i进行转换。规则是quite simple

返回作为 整数碱以STR解释前导字符的结果(2和36之间)。忽略有效数字末尾 后的无关字符。 如果在 处没有有效的数字,则返回str的起始位置0。当base有效时,此方法从不会引发异常 。

'(3)'是另一个字符串文字,它也不会自己评估为任何数字。问题在于你无法使解析器“理解”某种特定字符串的开头应该被视为分隔符,并且基本上被忽略。这不是它的工作原理。

一个可行的办法是在字符串的开头sub更换(符号(如尾非数字符号由to_i忽略):

'(3)'.sub(/^\(/, '').to_i => 3 

但我真的不知道为什么你得到括号首先在这里。

+0

谢谢你详尽的解释。 (我承认我可以查看文档,我认为to_i处理这样的字符串)。括号的使用仅仅是一个美学问题,没有什么大不了的。 – optimista

0

(3)红宝石表达,和'(3)'.to_i不为同样的原因,'Math.sqrt(9)'.to_i不起作用工作。

如果有帮助,您可以使用正则表达式来挑选出字符串若干部分,然后将其换算

puts '(3)'[/\d+/].to_i 

输出

3