Jump to content

Проверка HEX в строке Edit


Recommended Posts

Здравствуйте. Сегодня я пилил систему цветов, и наткнулся на некоторую проблему - каким образом можно проверить строку на HEX. Допустим есть строка с текстом "FF00ff" - она должна быть валидна по идее HEX'y, а строка "AZON16" не должна, возвращая false. То-есть проверка, все ли символы валидны HEX. Мне предложили заюзать паттерны, так и не объяснив, как юзать функцию sting.match, без примера (возможно сами не знают). Что-то говорили про %x, но я думаю это полный бред, так как тестировав эту деталь на Lua Demo он отвечал не те ответы, которые мне нужны. Я подумал насчёт цикла, и запилил таблицу с символами HEX (22 символа, 6 из которых написаны на разных регистрах, так как регистр, вроде, важен), вставив проверку в цикл. Всё время он возвращал мне false, пока я не ввёл все эти 22 символа (что собственно логично).

Короче говоря мне надо запилить проверку на 6символьный HEX.

Link to comment

ТС просил "проверку на 6символьный HEX". В обеих вариантах это не учитывается.

-- Первый вариант 
function Hex2Int( var ) 
    local sHex = tostring( var ); -- На всякий случай 
  
    return sHex:len() == 6 and tonumber( sHex, 16 ); -- Учитываем длину по просьбе и пытаемся сконвертировать строку в число. Функция возвращает int. 
end 
  
-- Второй вариант 
function Hex2Int( var ) 
    local sHex = tostring( var ); 
     
    return tonumber( sHex:match( "%x%x%x%x%x%x" ), 16 ); 
end 

В первом варианте не учитывается, что можно передать "0xFA5E", что по длине - 6 символов. В принципе можно использовать sub для первых двух символов.

Второй вариант вытаскивает из строки HEX, даже если присутствует префикс "0x" то он будет откинут, как и всё что после HEX. Т.е. если передать строку "blabla0x!FACE8DLOL" то в результате получите FACE8D только в десятичном виде (благодаря tonumber). Конечно все эти нюансы можно ограничить с помощью условий.

Link to comment
                local ggxt = guiGetText(hexcoder) 
                if string.len(tostring(ggxt)) == 6 then 
                    if tonumber(ggxt:match("%x%x%x%x%x%x"), 16) == nil then guiSetText(hexcoder, "Введите HEX код") 
                    else outputChatBox(tostring(tonumber(ggxt:match("%x%x%x%x%x%x"), 16))) end 
                else guiSetText(hexcoder, "Введите 6 символов") end 

Я сделал примерно так. Теперь когда я ввожу символы выше F мне посылает мессагу в дебаг, вместо того, чтобы сделать текст gui - "Введите HEX код". А так работает вроде нормально

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...