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.24 Максимальное число пересылаемых элементов

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

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


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

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

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. Преобразование чисел в строки

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

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


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

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

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


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

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

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


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

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

Кардинальное число и положение Одним из терминов, который иногда можно встретить в отношении наборов, включая таблицы- является кардинальное число (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.6.8 Незаданное Число Параметров

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

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


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

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

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


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

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

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


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

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

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


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

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

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