【问题标题】:Convert hex to decimal keeping fractional part in Lua将十六进制转换为十进制,在 Lua 中保留小数部分
【发布时间】:2011-02-10 18:51:10
【问题描述】:

Lua 的 tonumber 函数很好,但只能转换无符号整数,除非它们以 10 为底。我有一种情况,我想将 01.4C 之类的数字转换为十进制。

我有一个糟糕的解决方案:

function split(str, pat)
   local t = {} 
   local fpat = "(.-)" .. pat
   local last_end = 1
   local s, e, cap = str:find(fpat, 1)
   while s do
      if s ~= 1 or cap ~= "" then
        table.insert(t,cap)
      end
      last_end = e+1
      s, e, cap = str:find(fpat, last_end)
   end
   if last_end <= #str then
      cap = str:sub(last_end)
      table.insert(t, cap)
   end
   return t
end
-- taken from http://lua-users.org/wiki/SplitJoin

function hex2dec(hexnum)
  local parts = split(hexnum, "[\.]")
  local sigpart = parts[1]
  local decpart = parts[2]

  sigpart = tonumber(sigpart, 16)
  decpart = tonumber(decpart, 16) / 256

  return sigpart + decpart
end

print(hex2dec("01.4C")) -- output: 1.296875

如果有更好的解决方案,我会对此感兴趣。

【问题讨论】:

    标签: lua decimal hex


    【解决方案1】:

    这是一个更简单的解决方案:

    function hex2dec(hexnum)
            local a,b=string.match(hexnum,"(.*)%.(.*)$")
            local n=#b
            a=tonumber(a,16)
            b=tonumber(b,16)
            return a+b/(16^n)
    end
    
    print(hex2dec("01.4C")) -- output: 1.296875
    

    【讨论】:

    • +1 这是一个很好的解决方案,但对于我的特殊情况,我发现 Doug 的回答是最直接的。对于我目前使用此解决方案的平台以外的平台,我将使用它。谢谢!
    【解决方案2】:

    如果你的 Lua 是用 C99 编译器(或者更早的 gcc)编译的,那么...

    ~ e$ lua
    Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
    > return tonumber"0x01.4C"
    1.296875
    

    【讨论】:

    • 这是否记录在 Lua 文档中?这太简单了,我觉得错过它很愚蠢......
    • 它没有记录,并且依赖于实现/配置。在您的 luaconf.h 中有一个 #define lua_str2number(s,p) strtod((s), (p)) - 所以这完全取决于 strtod 的 C 库实现或您在 luaconf.h 中用于 lua_str2number 的任何内容
    • 很高兴知道。无论如何,这就是我将要使用的。谢谢!
    【解决方案3】:

    将“十六进制”点向右移动两位,转换为十进制,然后除以256。

    014C  ==>  332 / 256 = 1.296875
    

    【讨论】:

      猜你喜欢
      • 2016-10-14
      • 1970-01-01
      • 2018-04-09
      • 2015-01-26
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      相关资源
      最近更新 更多