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.

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


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"

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"

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"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.