2010-04-21 6 views
4

Функция тонов Lua хороша, но может конвертировать беззнаковые целые числа, если они не являются базовыми 10. У меня есть ситуация, когда у меня есть числа, такие как 01.4C, которые я хотел бы преобразовать в десятичные числа.Преобразование шестнадцатеричной в десятичную дробную часть в Lua

У меня есть вшивое решение:

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 

Я был бы заинтересован в лучшем решении для этого, если есть один.

ответ

7

Если Lua компилируется с C99 компилятор (или, возможно, ранее НКУ), то ...

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

это описано в документации Lua? Это настолько просто, что я чувствую себя немым из-за отсутствия его ... –

+1

Он не документирован и зависит от реализации/конфигурации. В вашем luaconf.h есть #define lua_str2number (s, p) strtod ((s), (p)) - так что все зависит от реализации библиотеки C strtod или любого другого, что вы используете для lua_str2number в luaconf.h –

+0

Хорошо знать. Независимо от того, что я буду использовать. Благодаря! –

4

переместить «heximal» Точечные два места справа, преобразовать в десятичную, а затем разделить на 256.

014C ==> 332/256 = 1.296875 
9

Вот простое решение:

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 
+0

+1 Это приятное решение, но для моего конкретного случая я нашел ответ Дага самым простым. Для платформ, отличных от тех, которые я сейчас нахожу в этом решении, я буду использовать. Благодаря! –

Смежные вопросы