Преобразование целого числа в шестнадцатеричную строку в Ruby

206

Существует ли встроенный способ преобразования целого числа в Ruby в его шестнадцатеричный эквивалент?

Что-то вроде противоположности String#to_i:

"0A".to_i(16) #=>10

Как, возможно,:

"0A".hex #=>10

Я знаю, как делать свои собственные, но, вероятно, более эффективно использовать встроенную функцию Ruby.

Мэтт Хотон
источник

Ответы:

325

Вы можете дать to_sбазу, отличную от 10:

10.to_s(16)  #=> "a"

Обратите внимание, что в ruby ​​2.4 FixNumи BigNumбыли унифицированы в Integerклассе. Если вы используете более старый ruby, проверьте документацию FixNum #to_s и BigNum #to_s

джинсовый
источник
4
Это ответ, который я искал, но он не задокументирован на связанной странице. Str.to_s => str указан как не принимающий параметры и имеет «Возвращает получателя». как единственная документация, но, похоже, работает
Мэтт Хотон
2
Сожалеем о том , что копия пасты ошибку конечно to_s на строки не принимает аргументов , но на Fixnum это делает :)
Жан
3
Ах, я искал в Integer метод .to_s и не смог его найти. В следующий раз я тоже загляну под Fixnum
Мэтт Хотон
1
Убедитесь, что исходный номер является экземпляром Fixnum, Float выдаст исключение.
Ли
88

Как насчет использования %/ sprintf:

i = 20
"%x" % i  #=> "14"
flxkid
источник
15
Спасибо за показ этого, мне нужно что-то, что получило бы строку фиксированной длины с добавлением '0'. Например: "% 02X"% 10 # => "0A"
Аарон Хинни
42
А для других рубиновых новичков: "#%02x%02x%02x" % [255, 0, 10] #=> "#ff000a"- Мне понадобилось немного времени, чтобы понять, как отправить несколько аргументов.
Ноябрь
1
Это потрясающий фрагмент Ruby!
OzBandit
4
@TomD% - это метод String, который эффективно обеспечивает сокращение для форматирования sprintf (они выполняют одни и те же внутренние вызовы). Это документировано в классе Струнный см ruby-doc.org/core-1.9.3/String.html#method-i-25
tardate
2
Меньше дублирования:[255, 0, 10].map{|x| '%02x'%x}.join
Рок Краль
78

Подвести итоги:

p 10.to_s(16) #=> "a"
p "%x" % 10 #=> "a"
p "%02X" % 10 #=> "0A"
p sprintf("%02X", 10) #=> "0A"
p "#%02X%02X%02X" % [255, 0, 10] #=> "#FF000A"
LRI
источник
Спасибо за количество цифр форматирования. Забыл об этом :)
onetwopunch
спас мой день хорошее преобразование RGB
Тим Кречмер
14

Вот еще один подход:

sprintf("%02x", 10).upcase

см. документацию sprintfздесь: http://www.ruby-doc.org/core/classes/Kernel.html#method-i-sprintf

ультразавр
источник
10
sprintf("%02X", 10)будет в верхнем регистре из-за верхнего регистра X. Нет необходимости вызывать метод upcase. Конкретный раздел ядра таков
BookOfGreg
4

На тот случай, если вы предпочитаете форматировать отрицательные числа:

p "%x" % -1   #=> "..f"
p -1.to_s(16) #=> "-1"
производитель инструментов
источник