Вход/Регистрация
Программирование на языке Ruby
вернуться

Фултон Хэл

Шрифт:

2.24. Преобразование строки в число (десятичное или иное)

Есть два основных способа преобразовать строку в число: методы

Integer
и
Float
модуля
Kernel
и методы
to_i
и
to_f
класса
String
. (Имена, начинающиеся с прописной буквы, например
Integer
, обычно резервируются для специальных функций преобразования.)

Простой случай тривиален, следующие два предложения эквивалентны:

x = "123".to_i # 123

y = Integer("123") # 123

Но если в строке хранится не число, то поведение этих методов различается:

x = junk".to_i # Молча возвращает 0.

y = Integer("junk") # Ошибка.

Метод

to_i
прекращает преобразование, как только встречает первый символ, не являющийся цифрой, а метод
Integer
в этом случае возбуждает исключение:

x = "123junk".to_i # 123

y = Integer("123junk") # Ошибка.

Оба метода допускают наличие пропусков в начале и в конце строки:

x = " 123 ".to_i # 123

y = Integer(" 123 ") # 123

Преобразование строки в число с плавающей точкой работает аналогично:

x = "3.1416".to_f # 3.1416

y = Float("2.718") # 2.718

Оба метода понимают научную нотацию:

x = Float("6.02е23") # 6.02е23

y = "2.9979246е5".to_f # 299792.46

Методы

to_i
и
Integer
также по-разному относятся к системе счисления. По умолчанию, естественно, подразумевается система по основанию 10, но другие тоже допускаются (это справедливо и для чисел с плавающей точкой).

Говоря о преобразовании из одной системы счисления в другую, мы всегда имеем в виду строки. Ведь целое число неизменно хранится в двоичном виде.

Следовательно, преобразование системы счисления — это всегда преобразование одной строки в другую. Здесь мы рассмотрим преобразование из строки (обратное преобразование рассматривается в разделах 5.18 и 5.5).

Числу в тексте программы может предшествовать префикс, обозначающий основание системы счисления. Префикс

0b
обозначает двоичное число,
0
— восьмеричное, а
0x
— шестнадцатеричное.

Метод

Integer
такие префиксы понимает, а метод
to_i
— нет:

x = Integer("0b111") # Двоичное - возвращает 7.

y = Integer("0111") # Восьмеричное - возвращает 73.

z = Integer("0x111") # Шестнадцатеричное - возвращает 291.

x = "0b111".to_i # 0

y = "0111".to_i # 0

z = "0x111".to_i # 0

Однако у метода

to_i
есть необязательный второй параметр для указания основания. Обычно применяют только четыре основания: 2, 8, 10 (по умолчанию) и 16. Впрочем, префиксы не распознаются даже при определении основания.

x = "111".to_i(2) # 7

y = "111".to_i(8) # Восьмеричное - возвращает 73.

z = "111".to_i(16) # Шестнадцатеричное - возвращает 291.

x = "0b111".to_i # 0

y = "0111".to_i # 0

z = "0x111".to_i # 0

Из-за «стандартного» поведения этих методов цифры, недопустимые при данном основании, обрабатываются по-разному:

x = "12389".to_i(8) # 123 (8 игнорируется).

y = Integer("012389") # Ошибка (8 недопустима).

Хотя полезность этого и сомнительна, метод

to_i
понимает основания вплоть до 36, когда в представлении числа допустимы все буквы латинского алфавита. (Возможно, это напомнило вам о base64-кодировании; дополнительную информацию по этому поводу вы найдете в разделе 2.37.)

x = "123".to_i(5) # 66

y = "ruby".to_i (36) # 1299022

Для преобразования символьной строки в число можно также воспользоваться методом

scanf
из стандартной библиотеки, которая добавляет его в модуль
Kernel
, а также классы
IO
и
String
:

str = "234 234 234"

x, y, z = str.scanf("%d %o %x") # 234, 156, 564

Метод

scanf
реализует всю имеющую смысл функциональность стандартных функций
scanf
,
sscanf
и
fscanf
из библиотеки языка С. Но строки, представляющие двоичные числа, он не обрабатывает.

  • Читать дальше
  • 1
  • ...
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: