Konvertieren einer Ganzzahl in eine hexadezimale Zeichenfolge in Ruby

206

Gibt es eine integrierte Methode, um eine Ganzzahl in Ruby in ihr hexadezimales Äquivalent umzuwandeln?

So etwas wie das Gegenteil von String#to_i:

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

Wie vielleicht:

"0A".hex #=>10

Ich weiß, wie man meine eigenen rollt, aber es ist wahrscheinlich effizienter, eine eingebaute Ruby-Funktion zu verwenden.

Matt Haughton
quelle

Antworten:

325

Sie können to_seine andere Basis als 10 angeben:

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

Beachten Sie, dass in Ruby 2.4 FixNumund BigNumin der IntegerKlasse vereinheitlicht wurden . Wenn Sie einen älteren Rubin verwenden, lesento_s Sie die Dokumentation zu FixNum # und BigNum #to_s

Jean
quelle
4
Das ist die Antwort, nach der ich gesucht habe, aber sie ist nicht auf der verlinkten Seite dokumentiert. Str.to_s => str wird als nicht akzeptierend für Parameter angegeben und hat "Gibt den Empfänger zurück". als einzige Dokumentation, aber es scheint zu funktionieren
Matt Haughton
2
Entschuldigung für diesen Fehler beim Kopieren und Einfügen. Natürlich nimmt to_s on string keine Argumente an, aber bei Fixnum :)
Jean
3
Ah, ich habe unter Integer nach einer .to_s-Methode gesucht und konnte keine finden. Ich werde das nächste Mal auch unter Fixnum schauen
Matt Haughton
1
Stellen Sie sicher, dass die ursprüngliche Nummer eine Instanz von Fixnum ist. Float löst eine Ausnahme aus.
Lee
88

Wie wäre es mit %/ sprintf:

i = 20
"%x" % i  #=> "14"
flxkid
quelle
15
Vielen Dank, dass Sie dies gezeigt haben. Ich brauchte etwas, mit dem ich eine Zeichenfolge mit fester Länge vor '0' erhalten konnte. Beispiel: "% 02X"% 10 # => "0A"
Aaron Hinni
42
Und für die anderen Rubin-Neulinge da draußen: "#%02x%02x%02x" % [255, 0, 10] #=> "#ff000a"- Ich habe ein bisschen gebraucht, um herauszufinden, wie ich mehrere Argumente senden kann.
ANeves
1
Dies ist ein extrem toller Ausschnitt von Ruby!
OzBandit
4
@TomD% ist eine String-Methode, die effektiv eine Abkürzung für die Sprintf-Formatierung bereitstellt (sie führen dieselben internen Aufrufe durch). Es ist in der String-Klasse dokumentiert, siehe ruby-doc.org/core-1.9.3/String.html#method-i-25
verspätet
2
Weniger Doppelarbeit:[255, 0, 10].map{|x| '%02x'%x}.join
Rok Kralj
78

Zusammenfassen:

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
quelle
Vielen Dank für die Anzahl der Ziffernformatierungen.
Ich habe das
hat meinen Tag gerettet. schöne RGB-Konvertierung
Tim Kretschmer
4

Nur für den Fall, dass Sie bevorzugen, wie negative Zahlen formatiert werden:

p "%x" % -1   #=> "..f"
p -1.to_s(16) #=> "-1"
Werkzeugmacher
quelle