2013-09-28 4 views
-2

Я пытаюсь получить целое число из строки '(3)'. Однако метод to_i возвращает 0. Кажется, что скобки с кавычками вызывают проблему, но я не понимаю причины.Ruby - Parsing '(3)' to integer возвращает 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:

Возвращает результат интерпретации ведущих символов в качестве ул базовой базы целого (между 2 и 36). Посторонние символы минус конец действительного числа игнорируются. Если номер недействителен, начинается старт, возвращается 0. Этот метод никогда не вызывает исключения , когда база действительна.

'(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