Перетворення цілого числа в шістнадцятковий рядок у Ruby


206

Чи існує вбудований спосіб перетворення цілого числа в Ruby в його шістнадцятковий еквівалент?

Щось схоже на протилежне String#to_i:

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

Можливо:

"0A".hex #=>10

Я знаю, як розгорнути свою власну, але, мабуть, ефективніше використовувати вбудовану функцію Ruby.

Відповіді:


325

Ви можете дати to_sбазу, крім 10:

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

Зауважте, що в рубіні 2.4 FixNumі BigNumбули уніфіковані в Integerкласі. Якщо ви використовуєте старіший рубін, перегляньте документацію FixNum #to_s та BigNum #to_s


4
Це відповідь, яку я шукав, але вона не задокументована на пов'язаній сторінці str.to_s => str вказана як неприйнята параметрів і має "Повернення приймача". як єдину документацію, але вона, здається, працює
Метт Хафтон,

2
Вибачте, що помилка копіювання вставити, звичайно, що to_s у рядку не бере аргументів, але на Fixnum це робить :)
Jean

3
Ах, я шукав у Integer метод .to_s і не зміг його знайти. Я наступного разу загляну під Fixnum
Метт Хотон

1
Переконайтеся, що оригінальний номер є екземпляром Fixnum, Float викине виняток.
лий

88

Як щодо використання %/sprintf :

i = 20
"%x" % i  #=> "14"

15
Дякую, що показали це, мені було потрібно щось, що дозволило б мені встановити рядок фіксованої довжини з попереднім значенням "0" напр .: "% 02X"% 10 # => "0A"
Аарон Хінні

42
А для інших рубінових новачків там: "#%02x%02x%02x" % [255, 0, 10] #=> "#ff000a"- Узяв мене трохи, щоб зрозуміти, як надіслати кілька аргументів.
ANeves

1
Це надзвичайно дивовижний фрагмент Рубі!
OzBandit

4
@TomD% - це метод String, який ефективно забезпечує стенограму для форматування sprintf (вони роблять однакові внутрішні дзвінки). Це задокументовано у класі String, див. Ruby-doc.org/core-1.9.3/String.html#method-i-25
tardate

2
Менше дублювання:[255, 0, 10].map{|x| '%02x'%x}.join
Rok Kralj

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"

Дякуємо за кількість форматування цифр. Забув про це :)
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. Конкретний розділ ядра такий: ruby-doc.org/core-1.9.3/Kernel.html#method-i-format
BookOfGreg

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.