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.

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


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"

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"

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"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.