Как преобразовать целое число в основе в строку

Иногда у меня есть целые числа, подобные этим 021 или 011.

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

p 021.to_s # "17" instead "021"
p 011.to_s # "9" instead "011"

Почему это происходит и как я могу преобразовать целые числа в строки?

021 — это литерал восьмеричного целого числа, и его значение равно 17, поэтому, когда вы вызываете для него to_s, вы получаете "17" — его значение в виде строки.
de-russification 30.05.2019 04:53

Вы можете использовать to_s(8), но вы потеряете первый 0.

de-russification 30.05.2019 04:58

Было бы полезно, если бы вы могли объяснить, что точно вам непонятно в документация. Таким образом, разработчики Ruby могут улучшить документацию, чтобы будущие разработчики не попали в ту же ловушку. Сделайте мир лучше!

Jörg W Mittag 30.05.2019 07:16

@JörgWMittag Возможно, проблема с документацией в том, что она не прочитана. Прочитать поможет.

the Tin Man 31.05.2019 02:05

@theTinMan: В этом случае вопрос аналогичен: почему ОП не смог найти документацию и что можно улучшить, чтобы упростить поиск документации?

Jörg W Mittag 31.05.2019 04:21
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
0
5
76
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Числовые литералы с начальным нулем считаются восьмеричными (с основанием 8) числами.

Метод to_s преобразует числа в десятичные числа по умолчанию (основание 10).

  • 21 восьмеричное 17 десятичное
  • 11 восьмеричных это 9 десятичных

Для получения ожидаемых результатов удалите начальные нули.

Вы можете обратиться к документации литералы, чтобы найти специальные префиксы для записи чисел в десятичном, шестнадцатеричном, восьмеричном или двоичном формате.

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 считается числом в восьмеричном формате. И при интерпретации для печати он использует десятичный формат по умолчанию.

Другие вопросы по теме