2015-10-12 3 views
1

Я получил следующий вывод в консоли ruby.Почему `Integer ('009')` не работает, но `Float ('009')` делает?

Integer('009') # => ArgumentError: invalid value for Integer(): "009" 

Но если я пытаюсь Преобразовать ту же строку в Float, она работает.

Float('009') # => 9.0 

Почему Float преобразовать это в то время как Integer не делает?

+1

Возможный дубликат [Как работать с ведущими нулями в целых числах] (http://stackoverflow.com/questions/28545559/how-to-work-with-leading-zeros-in-integers) –

+0

Этот ответ относится к синтаксическому анализу целых чисел в различных базах (в данном случае, восьмеричном). Поплавки всегда представлены в базе 10 и, таким образом, не проявляют такого поведения. –

ответ

10

Kernel#Integer интерпретирует аргументы, начиная с ведущего 0 как восьмеричное. Поскольку octal number system ony использует цифры 0-7, номер, содержащий 9, не определен. Из документации:

Если arg является строкой, когда база опущена или равна нулю, показатели счисления (0, 0b и 0x) соблюдаются.

Kernel#Float, с другой стороны, не ведет себя так.


Для преобразования "009" в целое число в основании 10 с помощью Integer, вам нужно передать необязательный аргумент, указывающий базу:

Integer("009", 10) 
5

В соответствии с docs

Преобразует аргумент в целочисленное значение. Если аргументом является строка, и начать с 0x, 0b, 0, интерпретирует ее как шестую, двоичную, восьмеричную строку соответственно.

С 009 интерпретируется как восьмеричный код ошибки.

В качестве альтернативы вы можете также сделать:

'009'.to_i 
#=> 9 

 Смежные вопросы

  • Нет связанных вопросов^_^