Konwersja liczby całkowitej na ciąg szesnastkowy w Rubim

206

Czy istnieje wbudowany sposób na konwersję liczby całkowitej w Rubim na jej szesnastkowy odpowiednik?

Coś w rodzaju przeciwieństwa String#to_i:

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

Może jak:

"0A".hex #=>10

Wiem, jak tworzyć własne, ale prawdopodobnie bardziej efektywne jest użycie wbudowanej funkcji Ruby.

Matt Haughton
źródło

Odpowiedzi:

325

Możesz podać to_sbazę inną niż 10:

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

Zauważ, że w Ruby 2.4 FixNumi BigNumzostały zunifikowane w Integerklasie. Jeśli używasz starszego rubinu, sprawdź dokumentację FixNum #to_s i BigNum #to_s

Drelich
źródło
4
Oto odpowiedź, której szukałem, ale nie jest ona udokumentowana na połączonej stronie str.to_s => str jest określony jako nieakceptujący parametrów i ma „Zwraca odbiornik”. jako jedyna dokumentacja, ale wydaje się, że działa
Matt Haughton,
2
przepraszam za ten błąd wklejania kopii oczywiście to_s na łańcuchu nie przyjmuje argumentów, ale na Fixnum robi :)
Jean
3
Ach, szukałem pod Integer dla metody .to_s i nie mogłem jej znaleźć. Następnym razem zajrzę pod Fixnum
Matt Haughton,
1
Upewnij się, że oryginalny numer jest instancją Fixnum, Float zgłosi wyjątek.
Lee
88

Co powiesz na użycie %/ sprintf:

i = 20
"%x" % i  #=> "14"
flxkid
źródło
15
Dzięki za pokazanie tego, potrzebowałem czegoś, co dałoby mi ciąg o stałej długości poprzedzony '0'. np .: „% 02X”% 10 # => „0A”
Aaron Hinni
42
A dla innych początkujących rubinów: "#%02x%02x%02x" % [255, 0, 10] #=> "#ff000a"- zajęło mi trochę wymyślenie, jak wysłać kilka argumentów.
ANeves
1
To niezwykle niesamowity fragment Ruby!
OzBandit
4
@TomD% to metoda String, która skutecznie zapewnia skrót do formatowania sprintf (wykonują te same wywołania wewnętrzne). Jest to udokumentowane w klasie String, patrz ruby-doc.org/core-1.9.3/String.html#method-i-25
opóźnienie
2
Mniej powielania:[255, 0, 10].map{|x| '%02x'%x}.join
Rok Kralj
78

Podsumowując:

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
źródło
Dziękujemy za liczbę formatów cyfrowych. Zapomniałem o tym :)
onetwopunch
uratował mi dzień. niezła konwersja RGB
Tim Kretschmer
4

Na wypadek, gdybyś preferował sposób formatowania liczb ujemnych:

p "%x" % -1   #=> "..f"
p -1.to_s(16) #=> "-1"
producent narzędzi
źródło