Mengonversi bilangan bulat ke string heksadesimal di Ruby

206

Apakah ada cara yang dibangun untuk mengubah integer di Ruby menjadi setara heksadesimalnya?

Sesuatu seperti kebalikan dari String#to_i:

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

Mungkin seperti:

"0A".hex #=>10

Saya tahu cara memutar sendiri, tetapi mungkin lebih efisien untuk menggunakan fungsi bawaan Ruby.

Matt Haughton
sumber

Jawaban:

325

Anda dapat memberikan to_sbasis selain 10:

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

Perhatikan bahwa dalam ruby ​​2.4 FixNumdan BigNumdisatukan di Integerkelas. Jika Anda menggunakan ruby ​​yang lebih tua periksa dokumentasi FixNum #to_s dan BigNum #to_s

Jean
sumber
4
Itulah jawaban yang saya cari tetapi tidak didokumentasikan pada halaman tertaut str.to_s => str ditentukan sebagai tidak menerima parameter dan memiliki "Mengembalikan penerima." sebagai satu-satunya dokumentasi, tetapi tampaknya berfungsi
Matt Haughton
2
maaf tentang kesalahan copy paste saja to_s pada string tidak mengambil argumen tetapi pada Fixnum itu :)
Jean
3
Ah, saya sedang mencari Integer untuk metode .to_s dan tidak dapat menemukannya. Saya akan mencari di bawah Fixnum lain kali
Matt Haughton
1
Pastikan nomor asli adalah instance dari Fixnum, Float akan melempar pengecualian.
lee
88

Bagaimana dengan menggunakan %/ sprintf:

i = 20
"%x" % i  #=> "14"
flxkid
sumber
15
Terima kasih telah menunjukkan ini, saya membutuhkan sesuatu yang akan membuat saya memiliki string panjang tetap yang diawali dengan '0'. mis: "% 02X"% 10 # => "0A"
Aaron Hinni
42
Dan untuk pemula ruby ​​lainnya di luar sana: "#%02x%02x%02x" % [255, 0, 10] #=> "#ff000a"- Butuh saya sedikit untuk mencari cara mengirim beberapa argumen.
ANeves
1
Ini adalah cuplikan Ruby yang sangat luar biasa!
OzBandit
4
@TomD% adalah metode String yang secara efektif menyediakan singkatan untuk pemformatan sprintf (mereka membuat panggilan internal yang sama). Ini didokumentasikan dalam kelas String, lihat ruby-doc.org/core-1.9.3/String.html#method-i-25
tardate
2
Lebih sedikit duplikasi:[255, 0, 10].map{|x| '%02x'%x}.join
Rok Kralj
78

Untuk meringkas:

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
sumber
Terima kasih untuk jumlah format digit. Lupa tentang itu :)
onetwopunch
menyelamatkan hari saya. konversi RGB yang bagus
Tim Kretschmer
4

Kalau-kalau Anda memiliki preferensi untuk bagaimana angka negatif diformat:

p "%x" % -1   #=> "..f"
p -1.to_s(16) #=> "-1"
pembuat alat
sumber