AriosJentu Posted February 10, 2014 Share Posted February 10, 2014 Здравствуйте. Сегодня я пилил систему цветов, и наткнулся на некоторую проблему - каким образом можно проверить строку на HEX. Допустим есть строка с текстом "FF00ff" - она должна быть валидна по идее HEX'y, а строка "AZON16" не должна, возвращая false. То-есть проверка, все ли символы валидны HEX. Мне предложили заюзать паттерны, так и не объяснив, как юзать функцию sting.match, без примера (возможно сами не знают). Что-то говорили про %x, но я думаю это полный бред, так как тестировав эту деталь на Lua Demo он отвечал не те ответы, которые мне нужны. Я подумал насчёт цикла, и запилил таблицу с символами HEX (22 символа, 6 из которых написаны на разных регистрах, так как регистр, вроде, важен), вставив проверку в цикл. Всё время он возвращал мне false, пока я не ввёл все эти 22 символа (что собственно логично). Короче говоря мне надо запилить проверку на 6символьный HEX. Link to comment
TheNormalnij Posted February 10, 2014 Share Posted February 10, 2014 tonumber( string, 16 ) Link to comment
Kenix Posted February 10, 2014 Share Posted February 10, 2014 if tonumber( '0xGG' ) then print( "OK" ); else print( "FAIL" ); end -- FAIL print( tonumber( '0xGG' ) and "OK" or "FAIL" ) -- FAIL print( tonumber( '0xFF' ) ) -- 255 Link to comment
TheNormalnij Posted February 10, 2014 Share Posted February 10, 2014 Мой вариант подходит, когда у строки не обозначено 0х Link to comment
Kernell Posted February 10, 2014 Share Posted February 10, 2014 ТС просил "проверку на 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
AriosJentu Posted February 11, 2014 Author Share Posted February 11, 2014 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now