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

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 из библиотеки языка С. Но строки, представляющие двоичные числа, он не обрабатывает.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

4.6.8 Незаданное Число Параметров

Из книги C++ автора Хилл Мюррей

4.6.8 Незаданное Число Параметров Для некоторых функций невозможно задать число и тип всех параметров, которые можно ожидать в вызове. Такую функцию описывают завершая список описаний параметров многоточием (...), что означает «и может быть, еще какие-то неописанные


13-Я КОМНАТА: Число человеческое

Из книги Журнал «Компьютерра» № 46 от 12 декабря 2006 года автора Журнал «Компьютерра»

13-Я КОМНАТА: Число человеческое Автор: Сергей Вильянов «Здесь мудрость. Кто имеет разум, тот сочтет число зверя, ибо это число человеческое; число его — шестьсот шестьдесят шесть». Откровение святого Иоанна Богослова гл. 13. ст. 18 Как известно, люди обожают искусственные


Делим на число пи

Из книги Журнал «Компьютерра» № 18 от 15 мая 2007 года автора Журнал «Компьютерра»

Делим на число пи Автор: Владислав БирюковКонечно, безоговорочно полагаться на приведенное на соседней странице ранжирование компаний не стоит – оно может служить лишь неким ориентиром. Слишком много в подобных расчетах условностей: какие показатели учитываются, с


8.2.3.6.2 Число колонок

Из книги Информационная технология ПРОЦЕСС СОЗДАНИЯ ДОКУМЕНТАЦИИ ПОЛЬЗОВАТЕЛЯ ПРОГРАММНОГО СРЕДСТВА автора Автор неизвестен


11.1. Число и величина

Из книги Феномен науки. Кибернетический подход к эволюции автора Турчин Валентин Фёдорович


4.24 Максимальное число пересылаемых элементов

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

4.24 Максимальное число пересылаемых элементов Каждая из рассмотренных нами технологий имеет различные максимальные размеры для своих кадров. После исключения заголовка кадра, заключительной части, а также заголовков LLC и SNAP (если они присутствуют), полученный результат


6.1.4. Преобразование строки в символ и обратно

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

6.1.4. Преобразование строки в символ и обратно Строки и символы можно преобразовывать друг в друга с помощью методов to_str и to_sym:a = "foobar"b = :foobara == b.to_str # trueb == a.to_sym # trueДля метапрограммирования иногда бывает полезен такой метод:class Symbol def +(other)  (self.to_s + other.to_s).to_sym endendОн позволяет


3.2. Преобразование чисел в строки

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

3.2. Преобразование чисел в строки ПроблемаИмеются числовые типы (int, float), и вам требуется поместить их содержимое в string, возможно, предварительно отформатировав.РешениеДля выполнения этого имеется множество способов, каждый из которых имеет свои достоинства и недостатки.


3.5. Лексический анализ строки, содержащей число в экспоненциальной форме

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

3.5. Лексический анализ строки, содержащей число в экспоненциальной форме ПроблемаИмеется строка, содержащая число в экспоненциальной форме, и требуется сохранить значение числа в переменной типа double.РешениеНаиболее простым способом анализа числа в экспоненциальной


4.12. Преобразование строки к нижнему или верхнему регистру

Из книги Цифровая фотография. Трюки и эффекты автора Гурский Юрий Анатольевич

4.12. Преобразование строки к нижнему или верхнему регистру ПроблемаИмеется строка, которую требуется преобразовать к нижнему или верхнему регистру.РешениеДля преобразования символов к нижнему или верхнему регистру используйте функции toupper и tolower из заголовочного файла


Кардинальное число и положение

Из книги Описание языка PascalABC.NET автора Коллектив РуБоард

Кардинальное число и положение Одним из терминов, который иногда можно встретить в отношении наборов, включая таблицы- является кардинальное число (cardinality, "мощность множества"). Оно описывает количество строк в наборе, который может быть таблицей или выходным набором.


Пример 4-4. Целое число или строка?

Из книги автора

Пример 4-4. Целое число или строка? #!/bin/bash# int-or-string.sh: Целое число или строка?a=2334 # Целое число.let "a += 1"echo "a = $a " # a = 2335echo # Все еще целое число.b=${a/23/BB} # замена "23" на "BB". # Происходит трансформация числа в строку.echo "b = $b" # b = BB35declare -i b


4.3. Экспозиция и число диафрагмы

Из книги автора

4.3. Экспозиция и число диафрагмы Читая этот раздел, вы заметите, что понятия выдержки и диафрагмы употребляются, как правило, в паре. Объясняется это просто: выдержка и диафрагма определяют значение ключевого понятия фотографии – экспозиции. Определение Экспозицией


Переменное число параметров

Из книги автора

Переменное число параметров Для указания того, что подпрограмма должна иметь переменное число параметров, используется ключевое слово params, за которым следует описание динамического массива. Например: function Sum(params a: array of integer): integer; begin Result := 0; for i: integer := 0 to a.Length do