Convertir un entero a una cadena hexadecimal en Ruby

206

¿Existe una forma integrada de convertir un entero en Ruby en su equivalente hexadecimal?

Algo como lo contrario de String#to_i:

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

Como tal vez:

"0A".hex #=>10

Sé cómo rodar el mío, pero probablemente sea más eficiente usar una función incorporada de Ruby.

Matt Haughton
fuente

Respuestas:

325

Puedes dar to_suna base que no sea 10:

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

Tenga en cuenta que en ruby ​​2.4 FixNumy BigNumse unificaron en la Integerclase. Si está utilizando un rubí anterior, consulte la documentación de FixNum #to_s y BigNum #to_s

Vaquero
fuente
44
Esa es la respuesta que estaba buscando, pero no está documentada en la página vinculada str.to_s => str se especifica como no acepta parámetros y tiene "Devuelve el receptor". como la única documentación, pero parece funcionar
Matt Haughton
2
perdón por el error de copiar y pegar, por supuesto, to_s en la cadena no toma argumentos, pero en Fixnum sí :)
Jean
3
Ah, estaba buscando en Integer un método .to_s y no pude encontrar uno. Veré debajo de Fixnum la próxima vez también
Matt Haughton
1
Asegúrese de que el número original sea una instancia de Fixnum, Float lanzará una excepción.
Lee
88

¿Qué hay de usar %/ sprintf:

i = 20
"%x" % i  #=> "14"
flxkid
fuente
15
Gracias por mostrar esto, necesitaba algo que me consiguiera una cadena de longitud fija antepuesta con '0'. ej .: "% 02X"% 10 # => "0A"
Aaron Hinni el
42
Y para los otros novatos de rubí: "#%02x%02x%02x" % [255, 0, 10] #=> "#ff000a"- me llevó un poco descubrir cómo enviar varios argumentos.
ANeves
1
¡Este es un fragmento extremadamente increíble de Ruby!
OzBandit
44
@TomD% es un método de cadena que efectivamente proporciona una abreviatura para el formato sprintf (hacen las mismas llamadas internas). Está documentado en la clase String, consulte ruby-doc.org/core-1.9.3/String.html#method-i-25
tarda
2
Menos duplicación:[255, 0, 10].map{|x| '%02x'%x}.join
Rok Kralj
78

Para resumir:

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
fuente
Gracias por el número de formato de dígitos. Olvidé eso :)
onetwopunch
Me salvó el día. buena conversión RGB
Tim Kretschmer
4

En caso de que prefiera el formato de los números negativos:

p "%x" % -1   #=> "..f"
p -1.to_s(16) #=> "-1"
fabricante de herramientas
fuente