我試圖從字符串'(3)'
獲取整數。然而方法to_i
返回0
。 似乎括號引用引起的問題,但我不明白原因。Ruby - 解析'(3)'爲整數返回0
'3'.to_i => 3
(3).to_i => 3
'(3)'.to_i => 0
爲什麼會發生,以及如何解決它?謝謝!
我試圖從字符串'(3)'
獲取整數。然而方法to_i
返回0
。 似乎括號引用引起的問題,但我不明白原因。Ruby - 解析'(3)'爲整數返回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
進行轉換。規則是quite simple:
返回作爲 整數鹼以STR解釋前導字符的結果(2和36之間)。忽略有效數字末尾 後的無關字符。 如果在 處沒有有效的數字,則返回str的起始位置0。當base有效時,此方法從不會引發異常 。
'(3)'
是另一個字符串文字,它也不會自己評估爲任何數字。問題在於你無法使解析器「理解」某種特定字符串的開頭應該被視爲分隔符,並且基本上被忽略。這不是它的工作原理。
一個可行的辦法是在字符串的開頭sub
更換(
符號(如尾非數字符號由to_i
忽略):
'(3)'.sub(/^\(/, '').to_i => 3
但我真的不知道爲什麼你得到括號首先在這裏。
(3)
是紅寶石表達,和'(3)'.to_i
不爲同樣的原因,'Math.sqrt(9)'.to_i
不起作用工作。
如果有幫助,您可以使用正則表達式來挑選出字符串是若干部分,然後將其換算
puts '(3)'[/\d+/].to_i
輸出
3
謝謝你詳盡的解釋。 (我承認我可以查看文檔,我認爲to_i處理這樣的字符串)。括號的使用僅僅是一個美學問題,沒有什麼大不了的。 – optimista