2013-09-28 46 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