我正在尝试从 string 获取整数'(3)'
。但是方法to_i
返回0
。似乎带引号的括号会导致问题,但我不明白原因。
'3'.to_i => 3
(3).to_i => 3
'(3)'.to_i => 0
为什么会发生以及如何解决?谢谢!
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
(3)
是一个表达式,而不是一个字符串;它评估为一个数字 3
。
'3'
是一个字符串文字,它不会计算为任何数字,但可以使用to_i
. 规则很简单:
返回将 str 中的前导字符解释为整数基基数(2 到 36 之间)的结果。超过有效数字末尾的无关字符将被忽略。如果 str 的开头没有有效数字,则返回 0。当 base 有效时,此方法永远不会引发异常。
'(3)'
是另一个字符串文字,同样它本身不会评估为任何数字。问题是您将无法让解析器以某种方式“理解”(
在这个特定字符串的开头应该被视为分隔符 - 并且基本上被忽略。这不是它的工作原理。
一种可能的解决方案是将(
字符串开头的符号替换为sub
(因为尾随的非数字符号被 忽略to_i
):
'(3)'.sub(/^\(/, '').to_i => 3
但我真的很想知道为什么你首先在这里得到括号。
(3)
是一个Ruby 表达式,并且'(3)'.to_i
由于不起作用的相同原因'Math.sqrt(9)'.to_i
而不起作用。
如果有帮助,您可以使用正则表达式来挑选字符串中的数字部分,并将其转换为
puts '(3)'[/\d+/].to_i
输出
3