-2

我正在尝试从 string 获取整数'(3)'。但是方法to_i返回0。似乎带引号的括号会导致问题,但我不明白原因。

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

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

4

3 回答 3

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
于 2013-09-28T11:21:46.703 回答
1

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

'3'是一个字符串文字,它不会计算为任何数字,但可以使用to_i. 规则很简单

返回将 str 中的前导字符解释为整数基基数(2 到 36 之间)的结果。超过有效数字末尾的无关字符将被忽略。如果 str 的开头没有有效数字,则返回 0。当 base 有效时,此方法永远不会引发异常。

'(3)'是另一个字符串文字,同样它本身不会评估为任何数字。问题是您将无法让解析器以某种方式“理解”(在这个特定字符串的开头应该被视为分隔符 - 并且基本上被忽略。这不是它的工作原理。

一种可能的解决方案是将(字符串开头的符号替换为sub(因为尾随的非数字符号被 忽略to_i):

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

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

于 2013-09-28T11:10:03.493 回答
0

(3)是一个Ruby 表达式,并且'(3)'.to_i由于不起作用的相同原因'Math.sqrt(9)'.to_i而不起作用。

如果有帮助,您可以使用正则表达式来挑选字符串中数字部分,并将其转换为

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

输出

3
于 2013-09-28T12:47:53.217 回答