Convertendo um número inteiro em uma sequência hexadecimal em Ruby


206

Existe uma maneira integrada de converter um número inteiro em Ruby em seu equivalente hexadecimal?

Algo como o oposto de String#to_i:

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

Como talvez:

"0A".hex #=>10

Eu sei como rodar sozinho, mas provavelmente é mais eficiente usar uma função interna do Ruby.

Respostas:


325

Você pode dar to_suma base diferente de 10:

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

Observe que no ruby ​​2.4 FixNume BigNumforam unificados na Integerclasse. Se você estiver usando um ruby ​​mais antigo, verifique a documentação do FixNum #to_s e BigNum #to_s


4
Essa é a resposta que eu estava procurando, mas ela não está documentada na página vinculada str.to_s => str é especificado como não aceita parâmetros e tem "Retorna o receptor". como a única documentação, mas parece funcionar
Matt Haughton

2
desculpe por isso copy paste erro de to_s curso na cadeia não ter argumentos, mas em Fixnum ele faz :)
Jean

3
Ah, eu estava procurando em Integer por um método .to_s e não consegui encontrar um. Também vou procurar sob Fixnum na próxima vez #
Matt Haughton

1
Verifique se o número original é uma instância do Fixnum, o Float lançará uma exceção.
Lee

88

Que tal usar %/ sprintf:

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

15
Obrigado por mostrar isso, eu precisava de algo que me desse uma string de comprimento fixo anexada com '0'. ex: "% 02X"% 10 # => "0A"
Aaron Hinni 31/10/08

42
E para os outros novatos em rubi por aí: "#%02x%02x%02x" % [255, 0, 10] #=> "#ff000a"- Levei um pouco para descobrir como enviar vários argumentos.
ANeves 22/03

1
Este é um trecho extremamente impressionante de Ruby!
amigos estão dizendo sobre ozbandit

4
@TomD% é um método String que efetivamente fornece uma abreviação para a formatação do sprintf (eles fazem as mesmas chamadas internas). Está documentado na classe String, consulte ruby-doc.org/core-1.9.3/String.html#method-i-25
atrasado em

2
Menos duplicação:[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"

Obrigado pelo número de formatação de dígitos. Esqueceu-se sobre isso :) #
307 onetwopunch

salvou o meu dia. Boa conversão RGB
Tim Kretschmer


4

Apenas no caso de você preferir como os números negativos são formatados:

p "%x" % -1   #=> "..f"
p -1.to_s(16) #=> "-1"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.