【问题标题】:Converting an integer to a hexadecimal string in Ruby在 Ruby 中将整数转换为十六进制字符串
【发布时间】:2010-09-10 05:02:35
【问题描述】:

是否有内置方法可以将 Ruby 中的整数转换为等效的十六进制?

类似String#to_i的反义词:

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

也许喜欢:

"0A".hex #=>10

我知道如何自己动手,但使用内置的 Ruby 函数可能更有效。

【问题讨论】:

    标签: ruby hex base-conversion


    【解决方案1】:

    你可以给to_s一个不是10的基数:

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

    请注意,在 ruby​​ 2.4 中,FixNumBigNum 统一在 Integer 类中。 如果您使用的是旧版 ruby​​,请查看 FixNum#to_sBigNum#to_s 的文档

    【讨论】:

    • 这就是我一直在寻找的答案,但它没有记录在链接页面 str.to_s => str 被指定为不接受参数并且具有“返回接收器”。作为唯一的文档,但它似乎有效
    • 抱歉,to_s 上的复制粘贴错误当然不带参数,但在 Fixnum 上却可以:)
    • 啊,我在 Integer 下寻找 .to_s 方法,但找不到。下次我也会在 Fixnum 下查看
    • 确保原来的数字是Fixnum的实例,Float会抛出异常。
    【解决方案2】:

    %/sprintf怎么样:

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

    【讨论】:

    • 感谢您展示这一点,我需要一些东西,它可以让我得到一个带有“0”的固定长度字符串。例如:“%02X”% 10 #=>“0A”
    • 对于其他 ruby​​ 新手:"#%02x%02x%02x" % [255, 0, 10] #=> "#ff000a" - 花了我一点时间弄清楚如何发送几个 args。
    • 这是一个非常棒的 Ruby sn-p!
    • @TomD % 是一个 String 方法,它有效地提供了 sprintf 格式的简写(它们进行相同的内部调用)。它记录在 String 类中,请参阅ruby-doc.org/core-1.9.3/String.html#method-i-25
    • 减少重复:[255, 0, 10].map{|x| '%02x'%x}.join
    【解决方案3】:

    总结一下:

    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"
    

    【讨论】:

    • 感谢数字格式的数量。忘记了:)
    • 拯救了我的一天。漂亮的 RGB 转换
    【解决方案4】:

    这是另一种方法:

    sprintf("%02x", 10).upcase
    

    在此处查看sprintf 的文档:http://www.ruby-doc.org/core/classes/Kernel.html#method-i-sprintf

    【讨论】:

    【解决方案5】:

    以防万一您对负数的格式有偏好:

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

    【讨论】:

      猜你喜欢
      • 2015-04-30
      • 2015-11-29
      • 2012-01-11
      • 2017-08-12
      • 2014-12-15
      • 2013-12-07
      相关资源
      最近更新 更多