Книга: Программирование на языке Ruby
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
из библиотеки языка С. Но строки, представляющие двоичные числа, он не обрабатывает.
- 2.1. Представление обычных строк
- 2.2. Альтернативная нотация для представления строк
- 2.3. Встроенные документы
- 2.4. Получение длины строки
- 2.5. Построчная обработка
- 2.6. Побайтовая обработка
- 2.7. Специализированное сравнение строк
- 2.8. Разбиение строки на лексемы
- 2.9. Форматирование строк
- 2.10. Строки в качестве объектов ввода/вывода
- 2.11. Управление регистром
- 2.12. Вычленение и замена подстрок
- 2.13. Подстановка в строках
- 2.14. Поиск в строке
- 2.15. Преобразование символов в коды ASCII и обратно
- 2.16. Явные и неявные преобразования
- 2.17. Дописывание в конец строки
- 2.18. Удаление хвостовых символов новой строки и прочих
- 2.19. Удаление лишних пропусков
- 2.20. Повтор строк
- 2.21. Включение выражений в строку
- 2.22. Отложенная интерполяция
- 2.23. Разбор данных, разделенных запятыми
- 2.24. Преобразование строки в число (десятичное или иное)
- 2.25. Кодирование и декодирование строк в кодировке rot13
- 2.26. Шифрование строк
- 2.27. Сжатие строк
- 2.28. Подсчет числа символов в строке
- 2.29. Обращение строки
- 2.30. Удаление дубликатов
- 2.31. Удаление заданных символов
- 2.32. Печать специальных символов
- 2.33. Генерирование последовательности строк
- 2.34. Вычисление 32-разрядного CRC
- 2.35. Вычисление МD5-свертки строки
- 2.36. Вычисление расстояния Левенштейна между двумя строками
- 2.37. base64-кодирование и декодирование
- 2.38. Кодирование и декодирование строк (uuencode/uudecode)
- 2.39. Замена символов табуляции пробелами и сворачивание пробелов в табуляторы
- 2.40. Цитирование текста
- 2.41. Заключение
- 2.17. Дописывание в конец строки
- 2.29. Обращение строки
- Инструмент командной строки gbak
- Инструмент командной строки gfix
- Преобразование XML в реляционную базу данных
- Единое имя файла параметров InterBase
- Определение пользовательского формата числовых данных
- Преобразование строки в целое: stoi( )
- Запросы, подсчитывающие строки
- Как открыть каталог с помощью командной строки?
- Как заблокировать компьютер с помощью командной строки?
- У файла и каталога есть атрибуты (например: Скрытый, Только чтение). Как ими управлять из командной строки?