Иногда у меня есть целые числа, подобные этим 021
или 011
.
Если я попытаюсь преобразовать их в строку, результатом будет:
p 021.to_s # "17" instead "021"
p 011.to_s # "9" instead "011"
Почему это происходит и как я могу преобразовать целые числа в строки?
Вы можете использовать to_s(8)
, но вы потеряете первый 0.
Было бы полезно, если бы вы могли объяснить, что точно вам непонятно в документация. Таким образом, разработчики Ruby могут улучшить документацию, чтобы будущие разработчики не попали в ту же ловушку. Сделайте мир лучше!
@JörgWMittag Возможно, проблема с документацией в том, что она не прочитана. Прочитать поможет.
@theTinMan: В этом случае вопрос аналогичен: почему ОП не смог найти документацию и что можно улучшить, чтобы упростить поиск документации?
Числовые литералы с начальным нулем считаются восьмеричными (с основанием 8) числами.
Метод to_s
преобразует числа в десятичные числа по умолчанию (основание 10).
Для получения ожидаемых результатов удалите начальные нули.
Вы можете обратиться к документации литералы, чтобы найти специальные префиксы для записи чисел в десятичном, шестнадцатеричном, восьмеричном или двоичном формате.
For decimal numbers use a prefix of 0d, for hexadecimal numbers use a prefix of 0x, for octal numbers use a prefix of 0 or 0o, for binary numbers use a prefix of 0b. The alphabetic component of the number is not case-sensitive.
21
или 0d21
считается числом в десятичном формате, а 021
считается числом в восьмеричном формате. И при интерпретации для печати он использует десятичный формат по умолчанию.
021
— это литерал восьмеричного целого числа, и его значение равно17
, поэтому, когда вы вызываете для него to_s, вы получаете"17"
— его значение в виде строки.