Функции Для Разработчиков, склад полезных функций |
Здравствуйте, гость ( Вход | Регистрация )
Функции Для Разработчиков, склад полезных функций |
6.9.2008, 15:58
Сообщение
#1
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Привожу полное преобразование на lua из кодировки cp1251 (Ansi) в utf-8 и обратно, с помощью функций AnsiToUtf8 и Utf8ToAnsi соответственно:
Код local ansi_decode={ [128]='\208\130',[129]='\208\131',[130]='\226\128\154',[131]='\209\147',[132]='\226\128\158',[133]='\226\128\166', [134]='\226\128\160',[135]='\226\128\161',[136]='\226\130\172',[137]='\226\128\176',[138]='\208\137',[139]='\226\128\185', [140]='\208\138',[141]='\208\140',[142]='\208\139',[143]='\208\143',[144]='\209\146',[145]='\226\128\152', [146]='\226\128\153',[147]='\226\128\156',[148]='\226\128\157',[149]='\226\128\162',[150]='\226\128\147',[151]='\226\128\148', [152]='\194\152',[153]='\226\132\162',[154]='\209\153',[155]='\226\128\186',[156]='\209\154',[157]='\209\156', [158]='\209\155',[159]='\209\159',[160]='\194\160',[161]='\209\142',[162]='\209\158',[163]='\208\136', [164]='\194\164',[165]='\210\144',[166]='\194\166',[167]='\194\167',[168]='\208\129',[169]='\194\169', [170]='\208\132',[171]='\194\171',[172]='\194\172',[173]='\194\173',[174]='\194\174',[175]='\208\135', [176]='\194\176',[177]='\194\177',[178]='\208\134',[179]='\209\150',[180]='\210\145',[181]='\194\181', [182]='\194\182',[183]='\194\183',[184]='\209\145',[185]='\226\132\150',[186]='\209\148',[187]='\194\187', [188]='\209\152',[189]='\208\133',[190]='\209\149',[191]='\209\151' } local utf8_decode={ [128]={[147]='\150',[148]='\151',[152]='\145',[153]='\146',[154]='\130',[156]='\147',[157]='\148',[158]='\132',[160]='\134',[161]='\135',[162]='\149',[166]='\133',[176]='\137',[185]='\139',[186]='\155'}, [130]={[172]='\136'}, [132]={[150]='\185',[162]='\153'}, [194]={[152]='\152',[160]='\160',[164]='\164',[166]='\166',[167]='\167',[169]='\169',[171]='\171',[172]='\172',[173]='\173',[174]='\174',[176]='\176',[177]='\177',[181]='\181',[182]='\182',[183]='\183',[187]='\187'}, [208]={[129]='\168',[130]='\128',[131]='\129',[132]='\170',[133]='\189',[134]='\178',[135]='\175',[136]='\163',[137]='\138',[138]='\140',[139]='\142',[140]='\141',[143]='\143',[144]='\192',[145]='\193',[146]='\194',[147]='\195',[148]='\196', [149]='\197',[150]='\198',[151]='\199',[152]='\200',[153]='\201',[154]='\202',[155]='\203',[156]='\204',[157]='\205',[158]='\206',[159]='\207',[160]='\208',[161]='\209',[162]='\210',[163]='\211',[164]='\212',[165]='\213',[166]='\214', [167]='\215',[168]='\216',[169]='\217',[170]='\218',[171]='\219',[172]='\220',[173]='\221',[174]='\222',[175]='\223',[176]='\224',[177]='\225',[178]='\226',[179]='\227',[180]='\228',[181]='\229',[182]='\230',[183]='\231',[184]='\232', [185]='\233',[186]='\234',[187]='\235',[188]='\236',[189]='\237',[190]='\238',[191]='\239'}, [209]={[128]='\240',[129]='\241',[130]='\242',[131]='\243',[132]='\244',[133]='\245',[134]='\246',[135]='\247',[136]='\248',[137]='\249',[138]='\250',[139]='\251',[140]='\252',[141]='\253',[142]='\254',[143]='\255',[144]='\161',[145]='\184', [146]='\144',[147]='\131',[148]='\186',[149]='\190',[150]='\179',[151]='\191',[152]='\188',[153]='\154',[154]='\156',[155]='\158',[156]='\157',[158]='\162',[159]='\159'},[210]={[144]='\165',[145]='\180'} } local nmdc = { [36] = '$', [124] = '|' } function AnsiToUtf8(s) local r, b = '' for i = 1, s and s:len() or 0 do b = s:byte(i) if b < 128 then r = r..string.char(b) else if b > 239 then r = r..'\209'..string.char(b - 112) elseif b > 191 then r = r..'\208'..string.char(b - 48) elseif ansi_decode[b] then r = r..ansi_decode[b] else r = r..'_' end end end return r end function Utf8ToAnsi(s) local a, j, r, b = 0, 0, '' for i = 1, s and s:len() or 0 do b = s:byte(i) if b < 128 then if nmdc[b] then r = r..nmdc[b] else r = r..string.char(b) end elseif a == 2 then a, j = a - 1, b elseif a == 1 then a, r = a - 1, r..utf8_decode[j][b] elseif b == 226 then a = 2 elseif b == 194 or b == 208 or b == 209 or b == 210 then j, a = b, 1 else r = r..'_' end end return r end |
|
|
13.9.2008, 18:06
Сообщение
#2
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Функция приведения к нижнему регистру:
Код function String2Lower(s) local r, b = '' s = s:lower() for i = 1, s:len() do b = s:byte(i) if b > 191 and b < 224 then b = b + 32 elseif b == 168 or b == 184 then b = 229 end r = r.._G.string.char(b) end return r end Функция приведения к верхнему регистру: Код function String2Upper(s) local r, b = '' s = s:upper() for i = 1, s:len() do b = s:byte(i) if b > 223 then b = b - 32 elseif b == 168 or b == 184 then b = 197 end r = r.._G.string.char(b) end return r end Более оптимальные по выполнению функции: Код String2Lower = function(s) for i = 192, 223 do s = s:gsub(_G.string.char(i), _G.string.char(i + 32)) end s = s:gsub(_G.string.char(168), _G.string.char(184)) return s:lower() end Код String2Upper = function(s)
for i = 224, 255 do s = s:gsub(_G.string.char(i), _G.string.char(i - 32)) end s = s:gsub(_G.string.char(184), _G.string.char(168)) return s:upper() end |
|
|
14.9.2008, 11:36
Сообщение
#3
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Функции форматирования шары:
Код function GetNormalShare(s) s = tonumber(s) or 0 if s >= 1125899906842624 then return (math.floor(1000 * s / 1125899906842624) / 1000).." ПБ" elseif s >= 1099511627776 then return (math.floor(1000 * s / 1099511627776) / 1000).." TБ" elseif s >= 1073741824 then return (math.floor(1000 * s / 1073741824) / 1000).." ГБ" elseif s >= 1048576 then return (math.floor(1000 * s / 1048576) / 1000).." МБ" elseif s >= 1024 then return (math.floor(1000 * s / 1024) / 1000).." КБ" else return s.." Б" end end Код function GetLongShare(s)
s = tonumber(s) or 0 local r = '' if s >= 1125899906842624 then r = r ~= '' and r..(" %s ПБ"):format(math.floor(s / 1125899906842624)) or r..math.floor(s / 1125899906842624).." ПБ" s = math.fmod(s, 1125899906842624) end if s >= 1099511627776 then r = r ~= '' and r..(" %s ТБ"):format(math.floor(s / 1099511627776)) or r..math.floor(s / 1099511627776).." ТБ" s = math.fmod(s, 1099511627776) end if s >= 1073741824 then r = r ~= '' and r..(" %s ГБ"):format(math.floor(s / 1073741824)) or r..math.floor(s / 1073741824).." ГБ" s = math.fmod(s, 1073741824) end if s >= 1048576 then r = r ~= '' and r..(" %s МБ"):format(math.floor(s / 1048576)) or r..math.floor(s / 1048576).." МБ" s = math.fmod(s, 1048576) end if s >= 1024 then r = r ~= '' and r..(" %s КБ"):format(math.floor(s / 1024)) or r..math.floor(s / 1024).." КБ" s = math.fmod(s, 1024) end if s < 1024 then r = r ~= '' and r..(" %s Б"):format(s) or r..s.." Б" end return r end |
|
|
15.9.2008, 22:31
Сообщение
#4
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Функции преобразования ip адреса в число и обратно:
Код function Ip2Num(sIP) Можно использовать для проверки рангов ip и для оптимального хранения ip адресов в бд.
local a, b, c, d = sIP:match"^(%d+)%.(%d+)%.(%d+)%.(%d+)$" return a * 16777216 + b * 65536 + c * 256 + d end function Num2Ip(i) i = tonumber(i) or 0 local r, d, zd = '', '.', "0." if i >= 16777216 then r = math.floor(i / 16777216)..d i = math.fmod(i, 16777216) else r = zd end if i >= 65536 then r = r..math.floor(i / 65536)..d i = math.fmod(i, 65536) else r = r..zd end if i >= 256 then r = r..math.floor(i / 256)..d i = math.fmod(i, 256) else r = r..zd end return r..i end |
|
|
23.9.2008, 17:05
Сообщение
#5
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Еще несколько интересных методов. Может кому понадобятся, может кого заинтересует (Я использую их в больших проектах. Они несколько сворачивают длинные выкладки).
Код tSys={} function tSys:Table(t) return type(t)=="table" and t end function tSys:TableNoVoid(t) return self:Table(t) and next(t) and t end function tSys:TableOrDef(t,d) return self:Table(t) or d or {} end function tSys:TableNoVoidOrDef(t,d) return self:TableNoVoid(t) or self:TableOrDef(t,d) end function tSys:Table2(t,s) return self:Table(t) and self:Table(t[s]) and t[s] end function tSys:TableNoVoid2(t,s) return self:Table2(t,s) and next(t[s]) and t[s] end function tSys:TableOrDef2(t,s,d) return self:Table(t) and (self:Table(t[s]) and t[s] or d or rawset(t,s,{}) and t[s]) or {} end function tSys:TableNoVoidOrDef2(t,d) return self:TableNoVoid2(t) or self:TableOrDef2(t,d) end function tSys:String(s) return type(s)=="string" and s end function tSys:StringNoVoid(s) return self:String(s) and s~="" and s end function tSys:StringOrDef(s,d) return self:String(s) or d or "" end function tSys:StringNoVoidOrDef(s,d) return self:StringNoVoid(s) or self:StringOrDef(s,d) end function tSys:String2(t,s) return self:Table(t) and self:String(t[s]) and t[s] end function tSys:StringNoVoid2(t,s) return self:String2(t,s) and t[s]~="" and t[s] end function tSys:StringOrDef2(t,s,d) return self:Table(t) and (self:String(t[s]) and t[s] or d or rawset(t,s,"") and t[s]) or "" end function tSys:StringNoVoidOrDef2(s,d) return self:StringNoVoid2(s) or self:StringOrDef2(s,d) end function tSys:Number(i) return type(i)=="number" and i end function tSys:NumberOrDef(i,d) return self:Number(i) or d or 0 end function tSys:StringOrNumber(s) return self:String(s) or self:Number(s) end function tSys:NumberOfString(s) return self:String(s) and tonumber(s) and s end function tSys:ToNumber(s) return self:String(s) and tonumber(s) or self:Number(s) end function tSys:NoVoid(s) return self:StringNoVoid(s) or self:Number(s) end function tSys:Eq0(s) return self:Number(s) and s==0 and s end function tSys:Eq1(s) return self:Number(s) and s==1 and s end function tSys:Eq2(s) return self:Number(s) and s==2 and s end function tSys:Eq01(s) return self:Number(s) and (s==0 or s==1) and s end --метод возвращает количество ВСЕХ полей таблицы (а не только количество индексных полей как функции table.getn или table.maxn) function tSys:GetN(t) local c=0 for _ in pairs(t) do c=c+1 end return c end P.S. Существуют различия между методами и функциями. tSys:GetN(t) - метод, tSys.GetN(t) - функция |
|
|
3.12.2008, 19:05
Сообщение
#6
|
|
Освоившийся участник Группа: Пользователи Сообщений: 307 Регистрация: 11.7.2008 Пользователь №: 173 Спасибо сказали: 31 раз |
Часто их теряю. Так что здесь оставлю. Надеюсь никто не против(знаю, что функция всем известная).
/* Serialize(tTable - Сама таблица, sTableName - Имя таблицы, hFile - Хендлер файла, т.е. нужен уже открытый файл) - Сохраняет таблицу в файле. -------------------- SaveTable(sFile - Путь к файлу, tTable - Сама таблица, sTableName - Имя таблицы) - Сохраняет таблицу в файле с помощью функции Serialize - т.е. она должна быть уже определена! -, отличие в том, что она сама открывает файл и закрывает его после выполнения поставленной задачи(т.е. нужен уже не hFile, а путь к нему). */ Код function Serialize(tTable, sTableName, hFile, sTab)
sTab = sTab or '' hFile:write(sTab..sTableName.." = {\n") for k, v in pairs(tTable) do if type(v) ~= "function" then local sKey = type(k) == "string" and ("[%q]"):format(k) or ("[%d]"):format(k) if type(v) == "table" then Serialize(v, sKey, hFile, sTab..'\t') else local sValue = type(v) == "string" and ("%q"):format(v) or tostring(v) hFile:write(sTab..'\t'..sKey.." = "..sValue) end hFile:write(",\n") end end hFile:write(sTab.."}") end function SaveTable(sFile, tTable, sTableName) local hFile = io.open(sFile, "w+") Serialize(tTable, sTableName, hFile) hFile:close() end |
|
|
30.1.2009, 13:21
Сообщение
#7
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Функция коррекции данных пользователя.
Если клиент неизвестен для хаба, то тэг клиента дописывается в описание. Данная функция извлекает тэг из описания и корректно прописывает данные пользователя (такие как слоты, хабы, режим и тд.). Данная функция корректно воспринимает тэг Авалинка. Код function GetNormalValue(tUser) if not tUser.sTag and tUser.sDescription then local sDescription,sTag,sClient,sClientVersion,sMode,iNormalHubs,iRegHubs,iOpHubs,iSlots,iLlimit = tUser.sDescription:match"(.*)(<(.+)%sV?:?(.-),M:(.-),H:(%d+)/(%d+)/(%d+),S:(%d+)>)$" if not sDescription then sDescription,sTag,sClient,sClientVersion,sMode,iNormalHubs,iRegHubs,iOpHubs,iSlots,iLlimit = tUser.sDescription:match"(.*)(<(.+)%sV?:?(.-),M:(.-),H:(%d+)/(%d+)/(%d+),S:(%d+),L:(%d+)>)$" end if not sDescription then sDescription,sTag,sClient,sClientVersion,sMode,iNormalHubs,iRegHubs,iOpHubs,iSlots,iLlimit = tUser.sDescription:match"(.*)(<(.+)%sV?:?(.-),M:(.-),H:(%d+)/(%d+)/(%d+),S:(%d+),B:(%d+)>)$" end tUser.sDescription=sDescription tUser.sTag=sTag tUser.sClient=sClient tUser.sClientVersion=sClientVersion tUser.sMode=sMode tUser.iNormalHubs=tonumber(iNormalHubs) tUser.iRegHubs=tonumber(iRegHubs) tUser.iOpHubs=tonumber(iOpHubs) tUser.iHubs=tonumber(iNormalHubs and iRegHubs and iOpHubs and (iNormalHubs + iRegHubs + iOpHubs)) tUser.iSlots=tonumber(iSlots) tUser.iLlimit=tonumber(iLlimit) end return tUser end Использование метода: Код function UserConnected(tUser)
tUser=GetNormalValue(tUser) ... end |
|
|
7.2.2009, 17:28
Сообщение
#8
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Функция форматирования шары, решающая сию проблему чисто математически.
Код function GetNormalSize(size, num) size = size or 0 local tSize, sSize = {" B"," kB"," MB"," GB"," TB"," PB"}, "" for i in pairs(tSize) do if size < 1000 then sSize = tSize[i] break end size = size/1024 end local tmp1, tmp2 = 1, 0 if size > 0 then num = num or 3 while size < 10^num do size, tmp1 = size*10, tmp1*10 end size, tmp2 = math.modf(math.floor(size)/10); tmp2 = tmp2*10 if tmp2 >=5 then size = size+1 end size = size/tmp1*10 end return tostring(size)..sSize end Первый аргумент - собственно размер шары в байтах, второй - до скольки знаков округлить значение шары. Если второй аргумент отсутствует, шара округляется до 3-х знаков. |
|
|
7.2.2009, 18:25
Сообщение
#9
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Недоработанный алгоритм. Простейшая проверка GetNormalSize(1052, 4) не даёт 4 знака после запятой (1.0273), а округляет до 1.027, то есть до третьего знака.
|
|
|
7.2.2009, 18:52
Сообщение
#10
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
|
|
|
7.2.2009, 19:07
Сообщение
#11
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
А что тогда означает выражение: "до скольки знаков округлить значение шары" ??
Код function GetNormalSize(s, n)
s=s and tonumber(s) or 0 n=n and "%."..n.."f" or "%.3f" if s>=1125899906842624 then return string.format(n,s/1125899906842624).." ПБ" elseif s>=1099511627776 then return string.format(n,s/1099511627776).." TБ" elseif s>=1073741824 then return string.format(n,s/1073741824).." ГБ" elseif s>=1048576 then return string.format(n,s/1048576).." МБ" elseif s>=1024 then return string.format(n,s/1024).." КБ" else return s.." Б" end end |
|
|
7.2.2009, 19:16
Сообщение
#12
|
|
Активный участник Группа: Заблокированные Сообщений: 87 Регистрация: 16.10.2008 Пользователь №: 805 Спасибо сказали: 35 раз |
Код function getNormalShare(share)
local i,tUnits = 1, {"B","KB","MB","GB","TB","PB","EB"} while share > 1024 do share = share / 1024 i = i + 1 end return string.format("%.3f",share).." "..(tUnits[i] or "??") end |
|
|
7.2.2009, 19:22
Сообщение
#13
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
|
|
|
7.2.2009, 20:33
Сообщение
#14
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Не знаю для чего нужно округлять до количества цифр, обычно округляют до какого-то знака после запятой, ну да ладно.
Самый быстрый по выполнению мой код, так как в ветке выполнения содержится минимальное количество операций, однако очень порадовал код sphinx-а))) : Код function GetNormalShare(s,n) local i,t=1,{"Б","КБ","МБ","ГБ","ТБ","ПБ"} s=s and tonumber(s) or 0 n=n and "%."..n.."f " or "%.3f " while s>0x400 do s,i=s/0x400,i+1 end return n:format(s)..(t[i] or "??") end 1) Цикл пробегается от меньшего значения - оптимизация прохода (большинство пользователей не имеют большой шары) 2) Цикл while, а не for, поэтому для выхода из цикла не нужен оператор break (в случае прохода по for i=1,6 нужен был оператор break) 3) Код не громоздкий |
|
|
7.2.2009, 21:05
Сообщение
#15
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Цитата Не знаю для чего нужно округлять до количества цифр, обычно округляют до какого-то знака после запятой Из соображений целесообразности. Ведь если шара 954.542324234 GB, то имеет смысл избавиться от всех знаков после запятой, поскольку такая точность в большинстве случаев не нужна. Ну а если 1.978678, то нужно оставить хотябы 2 знака потому что 1.978678 и 1 отличаются почти в 2 раза (хотя, юзеров с такой шарой надо банить, а не формарировать их шару ) PS. Какой смысл в этом выражении: Код s=s and tonumber(s) or 0 Не проще ли? Код s=s or 0
|
|
|
7.2.2009, 21:10
Сообщение
#16
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
дело в том, что в некоторых случаях шара из себя представляет строку: "47345783456", поэтому строка приводится к числу, хотя это можно выбросить, если контролировать это.
|
|
|
9.2.2009, 22:54
Сообщение
#17
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Код function ValidateNickArrival(user,data) Функция отправляет юзеру сообщение при входе на хаб. При этом сообщение отправляется раньше, чем остальные, в том числе и "копирайт" PtokaX. Выглядит это примерно так:Core.SendToUser(user, "Здесь пишем наше сообщение") end |
|
|
15.2.2009, 22:40
Сообщение
#18
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Аналог стандартной LUA функции для PtokaX:
Код function _G.print(...) local m = '' for i = 1, _G.select('#', ...) do m = m..tostring(_G.select(i, ...)) end Core.SendToAll(m) end Использование: Код print("55 qwerty ", 34, " ", 66, " str ", 12, " 78 ", 0x22b==555) Функции работы с бинарными числами. Функция, преобразующая десятичное число в бинарную строку: Код function tobin(n) local m, x = '' while n >= 2 do n, x = _G.math.modf(n / 2) m = 2 * x..m end return n ~= 0 and '1'..m or '0' end Функция, преобразующая бинарную строку в десятичное число: Код tonumber(str, 2) Можно использовать для раздачи собственных прав профилям хаба. Например, на хабе профили: 0 - Master, 1 - Operator, 2 - VIP, 3 - Reg, -1 - UnReg. Профили можно записать в двоичную строку. Будем полагать, что строка "11111" разрешает всем пяти профилям то или иное действие, строка "10000" разрешает действие только профилю Master. Думаю, что ясен смысл. |
|
|
16.2.2009, 14:17
Сообщение
#19
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Работа со стеком:
Код top=0; data={}; push=function(name,...) top=top+1 name=name or top data[top]=name data[tostring(name)]=top return name end pop=function(...) local name=table.remove(data) top=top-1 if data[name] then data[name]=nil end return name end getindex=function(name,...) return name and -top+data[tostring(name)]-1 or 0 end clean=function() top,data=0,{} end Функция push помещает элемент в стек, функция pop извлекает последний элемент из стека, функция getindex возвращает глубину элемента в стеке, функция clean очищает стек. |
|
|
18.2.2009, 21:17
Сообщение
#20
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Очередная интересная по реализации функция форматирования шары:
Код local t={"Б","КБ","МБ","ГБ","ТБ","ПБ"} local function loop(i,n,c) if i<0x400 then coroutine.yield(n:format(i)..(t[c] or "??"))end return loop(i/0x400,n,c+1) end GetNormalShare=coroutine.wrap(function(s,n)return loop(s and tonumber(s) or 0,n and "%."..n.."f " or "%.3f ",1)end) Использование: Код Core.SendToAll(GetNormalShare(142589996842624,4))
|
|
|
Похожие темы
|
Сейчас: 4.12.2024, 15:50 |