编辑“︁
Module:沙盒/cwek/Convert
”︁
跳转到导航
跳转到搜索
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
local Convert={} --组名 Convert["group_name"]={"length","area","volume","speed","force","energy","temperature","mass","torque"} --基准单位 Convert["baseunit"]={"m","m2","m3","m/s","N","J","K","kg","Nm"} --基础数据 -- local Convert_Date=dofile("D:\\documents\\Github\\mw_lua_convert\\data.lua") -- local Convert_Date=dofile("D:\\GitHub\\mw_lua_convert\\data.lua") local Convert_Date=mw.loadData("模块:沙盒/cwek/Convert/data") --温度,基准为K --[0]为目标转基准,[1]为基准转目标 --从data.lua移入 local Convert_Date_of_temperature={["value"]={["temperature"]={}}} Convert_Date_of_temperature.value.temperature={ --国际单位制 ["K"]={function(input) return 1*input end,function(input) return 1*input end}, ["C"]={function(input) return (input+273.15) end ,function(input) return input-273.15 end}, --英制和美国常用 ["R"]={function(input) return (input/1.8) end,function(input) return input*1.8 end}, ["F"]={function(input) return ((input+459.67)/1.8) end,function(input) return input*1.8-459.67 end} } Convert_Date_of_temperature.value.temperature["°C"]=Convert_Date_of_temperature.value.temperature["C"] Convert_Date_of_temperature.value.temperature["°R"]=Convert_Date_of_temperature.value.temperature["R"] Convert_Date_of_temperature.value.temperature["°F"]=Convert_Date_of_temperature.value.temperature["F"] Convert["temperature_unit"]={"K","C","R","F","°C","°R","°F"} ---- --特别内容-- --支持2值算单值的单位(组合输入单位) --{第一个单位={{第一个单位,第二个单位},...},...} Convert["input_together"]={ ["ft"]={{"ft","in"}}, ["st"]={{"st","lb"}}, ["lb"]={{"lb","oz"}} } --支持组合输出单位的 --{单位={允许的单位,...},...} Convert["output_together"]={ --长度 ["km"]={"mi"}, ["m"]={"ft","ftin"}, ["cm"]={"in"}, ["mm"]={"in"}, ["mi"]={"km"}, ["ft"]={"m"}, ["in"]={"cm","mm"}, --面积 ["km2"]={"sqmi"}, ["m2"]={"sqft"}, ["cm2"]={"sqin"}, ["mm2"]={"sqin"}, ["sqmi"]={"km2"}, ["sqft"]={"m2"}, ["sqfoot"]={"m2"}, ["sqin"]={"cm2"}, --体积 ["l"]={"impgal","USgal","U.S.gal","USdrygal","U.S.drygal"}, ["L"]={"impgal","USgal","U.S.gal","USdrygal","U.S.drygal"}, ["ml"]={"impoz","USoz","U.S.oz"}, ["mL"]={"impoz","USoz","U.S.oz"}, ["impgal"]={"l","L","USgal","U.S.gal","USdrygal","U.S.drygal"}, ["impoz"]={"USoz","U.S.oz","ml","mL"}, ["USgal"]={"l","L","impgal"}, ["U.S.gal"]={"l","L","impgal"}, ["USoz"]="ml","mL","impoz", ["U.S.oz"]="ml","mL","impoz", ["USdrygal"]={"l","L","impgal"}, ["U.S.drygal"]={"l","L","impgal"}, --速度 ["m/s"]={"ft/s","foot/s"}, ["km/h"]={"mph"}, ["mph"]={"km/h","kn"}, ["ft/s"]={"m/s"}, ["kn"]={"mph"}, --力量 ["GN"]={"LT-f","LTf","ST-f","STf"}, ["MN"]={"LT-f","LTf","ST-f","STf"}, ["kN"]={"LT-f","LTf","ST-f","STf"}, ["N"]={"lb-f","lbf","oz-f","ozf"}, ["mN"]={"oz-f","ozf","gr-f","grf"}, ["μN"]={"gr-f","grf"}, ["uN"]={"gr-f","grf"}, ["nN"]={"gr-f","grf"}, ["LT-f"]={"ST-f"}, ["LTf"]={"STf"}, ["ST-f"]={"LT-f"}, ["STf"]={"LTf"}, --能量 --温度 ["K"]={"°C","°R","°F","C","R","F"}, ["°C"]={"K","°R","°F","R","F"}, ["C"]={"K","°R","°F","R","F"}, ["°R"]={"K","°C","°F","C","F"}, ["R"]={"K","°C","°F","C","F"}, ["°F"]={"K","°C","°R","C","R"}, ["F"]={"K","°C","°R","C","R"}, --质量 ["kg"]={"lb","st"}, ["g"]={"oz"}, ["mg"]={"gr"}, ["t"]={"LT","ST"}, ["MT"]={"LT","ST"}, ["LT"]={"t","MT","ST"}, ["ST"]={"t","MT","ST"}, ["st"]={"kg","lb"}, ["lb"]={"kg","st"}, ["oz"]={"g"}, --力矩 ["Nm"]={"lbft","lbfft"} } --温度差处理 Convert["temperature_range"]={"C-change","F-change"} --2+单元修饰词 Convert["range_embellish"]={ ["to"]="到", ["and"]="和", ["or"]="或", ["to(-)"]="到", ["+/-"]="±", ["x"]="到", ["-"]="-" } --[[ 从方法开始 --]] --[[ 单位查找方法 --]] --判断是否是温度单位 --@param unit:输入单位名 --@return false|true function Convert.is_temperature_unit(unit) for k,v in pairs(Convert_Date_of_temperature.value.temperature) do if k==unit then return true end end return false end --获得温度的换算器 --@param unit:输入的温度单位名 --@return 温度单位的换算函数数组 function Convert.get_temperature_unit_Convert(unit) return Convert_Date_of_temperature.value.temperature[unit] end --单个单位检查工具 --@param unit:输入单位名 --@return <单位所属组名>,[false|true] function Convert.unit_check(unit) local flag=false local group=nil if(tonumber(unit)~=nil)then return group,flag end for k,group_name in pairs(Convert.group_name) do if group_name=="temperature" then--针对温度 if Convert.is_temperature_unit(unit) then return "temperature",true end else for unit_name,v in pairs(Convert_Date.value[group_name]) do--通常,其他 if unit_name==unit then group=group_name flag=true return group,flag end end end end return group,flag end --单位转换值查找 --@param group:单位所属组 --@param unit:输入单位名 --@return [值(非温度的换算值)|函数数组(温度的换算函数)] function Convert.unit_Convert_value(group,unit) if group=="temperature" and Convert.is_temperature_unit(unit) then return Convert.get_temperature_unit_Convert(unit)--数组 else return Convert_Date.value[group][unit]--数 end end --检查输入的两个单位是否是组合输入单位 --@param unitA:第一个输入单位 --@param unitB:第二个输入单位 --@return false|true function Convert.is_input_together(unitA,unitB) for k1,v1 in pairs(Convert.input_together) do if k1==unitA then for k2,v2 in pairs(v1) do if (v2[1]==unitA and v2[2]==unitB) then return true end end end end return false end --检查输入的字符串是否输出组合单位 --@param input:输入的字符串 --@return [false,nil,nil|true,<第一个单位>,<第二个单位>] function Convert.is_out_together(input) local _,_,unitA,unitB=string.find(input,"(%a+)%s(%a+)") local groupA,flagA=Convert.unit_check(unitA) local groupB,flagB=Convert.unit_check(unitB) if (flagA and flagB) and groupA==groupB then return true,unitA,unitB else return false,nil,nil end end --根据组查阅组的基准单位 --@param group:单位组名 --@return [<基准单位名>|nil] function Convert.base_unit(group) for k,v in pairs(Convert.group_name) do if v==group then return Convert.baseunit[k] end end return nil end --[[ 构造类方法 --]] --修饰词确认和查找对应 --@param input:输入检查字符串 --@return [原字符串|对应的修饰词],[false|true] function Convert.embellish(input) for k,v in pairs(Convert.range_embellish) do if k==input then return Convert.range_embellish[k],true end end return input,false end --单位链接值查找 --@param group:单位组名 --@param unit:单位名 --@return [false|<单位的链接值>] function Convert.link_finder(group,unit) for k,v in pairs(Convert_Date.link[group]) do local linkname=k for k,t in pairs(v) do if unit==t then return linkname end end end return false end --单位链接值建造 --@param flag:显示链接标记旗 --@param group:单位组名 --@param unit:单位名 --@param display:显示值 --@return <处理好的字符串(链接模式或纯文本)> function Convert.link_builder(flag,group,unit,display) local code local t=Convert.link_finder(group,unit) if(flag and t~=false)then code="[["..t.."|"..display.."]]" else code=display end return code end --单位显示值建造(中文全称或缩名) --@param group:单位组名 --@param unit:单位名 --@param flag:显示全程或缩名标记旗<true为缩名,false为全名> --@return <处理好的字符串(全名或缩名)> function Convert.display_builder(group,unit,flag) local t_arr=Convert_Date.display[group][unit] if(not flag) or (flag and t_arr[2]==nil)then return t_arr[1]--全名 else return t_arr[2]--缩名 end end --取整 --@param input:输入值 --@param sigfig:取整数 --@return <处理数> function Convert.sigfig_func(input,sigfig) local t,_=math.modf(input*math.pow(10,sigfig)+0.5) local s=t/math.pow(10,sigfig) if sigfig<0 then return string.format("%."..math.abs(sigfig).."d",s) else return string.format("%."..sigfig.."f",s) end end --取5整 --@param input:输入值 --@return <处理数> function Convert.sigfig5_func(input) local t=tonumber(Convert.sigfig_func(input,0)) local x=(math.fmod(t,10)) if(x<2.5)then return t-x elseif(x>=2.5 and x<5)then return t+(5-x) elseif(x>=5 and x<7.5)then return t-(x-5) elseif(x>=7.5) then return t+(10-x) end end --转换参数构造函数 --@param group:单位组名 --@param in_unit:输入单位 --@param out_unit:输出单位 --@return <方法(用于转换方法)> function Convert.convert_builder(group,in_unit,out_unit) local a_t local b_t if Convert.is_temperature_unit(in_unit) and Convert.is_temperature_unit(out_unit)then a_t=Convert.get_temperature_unit_Convert(in_unit) b_t=Convert.get_temperature_unit_Convert(out_unit) else a_t=Convert_Date.value[group][in_unit] b_t=Convert_Date.value[group][out_unit] end if type(a_t)=="number" and type(b_t)=="number" then--如果是普通数(非温度类) local a,b=a_t,b_t return function(input) return input*a/b end else--温度类的处理 local a_K,K_b=a_t[1],b_t[2] return function(input) return K_b(a_K(input)) end end end --[[ 主方法开始 --]] --传入参数初始化 --@param frame:mw.frame --@return <数组(负载)> -- function Convert.init(args) -- local args_from_template=args function Convert.init(frame) local args_from_template=frame:getParent().args local args={}--准备载具 for k,v in pairs(args_from_template) do if(tonumber(k)~=nil)then args[tonumber(k)]=v else args[k]=v end end if not args["lk"] then--设定lk默认值 args["lk"]="off" end if not args["abbr"] then--设定abbr默认值 args["abbr"]="off" end if not args["disp"] then--设定disp默认值 args["disp"]="b" end if not args["sigfig"] then--设定sigfig默认值 args["sigfig"]=3 end return args end --整理参数,确定处理数 function Convert.cheak(args) --根据索引参数组的数字排序判断处理单元数 local t_processCount=0 local t_mark=0 --local t_unit=nil --local t_unit_group=nil local groupA,flagA local groupB,flagB --[[ 检查是否1个处理单元 --]] t_mark=2--锁定检查索引2 t_processCount=1 for k,v in pairs(Convert["temperature_range"]) do--温度间转换 if v==args[t_mark] then --t_processCount=1 args["processCount"]=t_processCount args["group"]="temperature" args["temperature_range"]=v args["mark"]=t_mark args["last_mark"]=t_mark--离索引参数有效位最后前一位 if tonumber(args[args["last_mark"]+1])~=nil then--使用索引参数标记有效位,记录 args["sigfig_inindex"]=tonumber(args[args["last_mark"]+1]) end --print("TR ok") return args end end --print("TR miss") groupA,flagA=Convert.unit_check(args[t_mark]); if flagA==true then--确认第一个是单位,以区分联系词(2个处理单元) --确认是不是组合输入(索引参数4是不是同组单位) if Convert.is_input_together(args[t_mark],args[t_mark+2])then groupB,flagB=Convert.unit_check(args[t_mark+3]) if groupB==groupA and flagB then args["processCount"]=t_processCount args["group"]=groupA args["inputtogether"]=true args["mark"]=t_mark args["last_mark"]=t_mark+3--离索引参数有效位最后前一位 if tonumber(args[args["last_mark"]+1])~=nil then--使用索引参数标记有效位,记录 args["sigfig_inindex"]=tonumber(args[args["last_mark"]+1]) end --print("IT ok") return args end end --print("IT miss") --索引3为空或索引3为数字(索引约位数) if args[t_mark+1]==nil or tonumber(args[t_mark+1])~=nil then local t_args3=args[t_mark+1] or nil--读出参数3 local out_unit=Convert.base_unit(groupA)--查出输入单位所属基准单位 --替换掉 args[t_mark+1]=out_unit args[t_mark+2]=t_args3 end --确认是不是组合输出(索引数组3是不是同组单位) local out_together_flag,unitA,unitB=Convert.is_out_together(args[t_mark+1]) if out_together_flag then local groupBA,flagBA=Convert.unit_check(unitA) local groupBB,flagBB=Convert.unit_check(unitB) if (groupBA==groupA and groupBB==groupA) and (flagBA and flagBB) then args["processCount"]=t_processCount args["group"]=groupA args["outputtogether"]={unitA,unitB} args["mark"]=t_mark args["last_mark"]=t_mark+1--离索引参数有效位最后前一位 if tonumber(args[args["last_mark"]+1])~=nil then--使用索引参数标记有效位,记录 args["sigfig_inindex"]=tonumber(args[args["last_mark"]+1]) end --print("OT ok") return args end end --print("OT miss") --确认是不是普通的1个单元处理(索引数组3) groupB,flagB=Convert.unit_check(args[t_mark+1]) if flagB and groupB==groupA then args["processCount"]=t_processCount args["group"]=groupA args["mark"]=t_mark args["last_mark"]=t_mark+1--离索引参数有效位最后前一位 if tonumber(args[args["last_mark"]+1])~=nil then--使用索引参数标记有效位,记录 args["sigfig_inindex"]=tonumber(args[args["last_mark"]+1]) end --print("P1 ok") return args end end --print("P1 miss") local embellish,flag_embellish args["embellish"]={} --[[ 检查是否2个处理单元 --]] t_mark=4--锁定检查索引4 t_processCount=2 embellish,flag_embellish=Convert.embellish(args[t_mark-2])--确认索引数组2是不是修饰词并获得修饰词 ----if Convert.embellish(args[t_mark-2]) then args["embellish"][1]=embellish ----end --检查索引4和索引5是否是单位,是则确认为2个处理数 groupA,flagA=Convert.unit_check(args[t_mark]) groupB,flagB=Convert.unit_check(args[t_mark+1]) if groupA==groupB and (flagA and flagB) then args["processCount"]=t_processCount args["group"]=groupA args["mark"]=t_mark args["last_mark"]=t_mark+1--离索引参数有效位最后前一位 if tonumber(args[args["last_mark"]+1])~=nil then--使用索引参数标记有效位,记录 args["sigfig_inindex"]=tonumber(args[args["last_mark"]+1]) end --print("P2 ok") return args end --print("P2 miss") --[[ 检查是否3个处理单元 --]] t_mark=6--锁定检查索引4 t_processCount=3 embellish,flag_embellish=Convert.embellish(args[t_mark-2])--确认索引数组2是不是修饰词并获得修饰词 ----if Convert.embellish(args[t_mark-2]) then args["embellish"][2]=embellish ----end --检查索引6和索引7是否是单位,是则确认为2个处理数 groupA,flagA=Convert.unit_check(args[t_mark]) groupB,flagB=Convert.unit_check(args[t_mark+1]) if groupA==groupB and (flagA and flagB) then args["processCount"]=t_processCount args["group"]=groupA args["mark"]=t_mark args["last_mark"]=t_mark+1--离索引参数有效位最后前一位 if tonumber(args[args["last_mark"]+1])~=nil then--使用索引参数标记有效位,记录 args["sigfig_inindex"]=tonumber(args[args["last_mark"]+1]) end --print("P3 ok") return args end --print("P3 miss") --[[ 检查是否4个处理单元 --]] t_mark=8--锁定检查索引6 t_processCount=4 embellish,flag_embellish=Convert.embellish(args[t_mark-2])--确认索引数组2是不是修饰词并获得修饰词 ----if Convert.embellish(args[t_mark-2]) then args["embellish"][3]=embellish ----end --检查索引6和索引7是否是单位,是则确认为2个处理数 groupA,flagA=Convert.unit_check(args[t_mark]) groupB,flagB=Convert.unit_check(args[t_mark+1]) if groupA==groupB and (flagA and flagB) then args["processCount"]=t_processCount args["group"]=groupA args["mark"]=t_mark args["last_mark"]=t_mark+1--离索引参数有效位最后前一位 if tonumber(args[args["last_mark"]+1])~=nil then--使用索引参数标记有效位,记录 args["sigfig_inindex"]=tonumber(args[args["last_mark"]+1]) end --print("P4 ok") return args end --print("ALL miss") args["error"]="没找到匹配模式,请检查参数格式是否正确" --结束 return args end --[[ 选择并执行对应的转换模式方法 @param 负载数组 @return 显示代码 --]] function Convert.select(args) local switch={} switch[1]=Convert.bind_1 switch[2]=Convert.bind_2 switch[3]=Convert.bind_3 switch[4]=Convert.bind_4 switch["temperature_range"]=Convert.bind_1_tempRange switch["inputtogether"]=Convert.bind_1_intogether switch["outputtogether"]=Convert.bind_1_outtogether switch["error"]=Convert.bind_error local flag=args["processCount"] if args["temperature_range"]~=nil then flag="temperature_range" elseif args["inputtogether"]~=nil then flag="inputtogether" elseif args["outputtogether"]~=nil then flag="outputtogether" elseif args["error"]~=nil then flag="error" end return switch[flag](args) end --输出错误 function Convert.bind_error(args) return String.format('<span class="class">%s</span>',args["error"]) end --[[ args可能有: 原生数据, 必然存在: ["processCount"]=<处理单元数> ["group"]=<单元组名> ["mark"]=第一个单位的起始位标fo ["last_mark"]=离(假设的)索引参数有效位最后前一位 可能存在: ["sigfig_inindex"]=通过索引参数传入的有效位数 (1)["temperature_range"]=温度间转换标记(表明那种转换) (1)["inputtogether"]=组合输入标记(true) (1)["outputtogether"]=组合输出标记(输出单位数组) (2,3,4)["embellish"]=联系词数组 --]] --[[ 处理普通1个处理单元 --]] function Convert.bind_1(args) --锁定锚点 local mark=args["mark"] --初始化数值,单位,转换方法 local in_num,out_num=tonumber(args[mark-1]),0 local in_unit,out_unit,group_name=args[mark],args[mark+1],args["group"] local function_convert=Convert.convert_builder(group_name,in_unit,out_unit) --换算中 out_num=function_convert(in_num) --有效位数计算 local sigfig=0 if args["sigfig_inindex"]~=nil then sigfig=tonumber(args["sigfig_inindex"]) elseif args["sigfig"] then sigfig=tonumber(args["sigfig"]) end local function_sigfig=Convert.sigfig_func if args["disp"]=="5" then function_sigfig=Convert.sigfig5_func end out_num=function_sigfig(out_num,sigfig) --输出 --输出准备 local out --读取lk,abbr,disp local lk,abbr,disp=args["lk"],args["abbr"],args["disp"] local lk_in_flag,lk_out_flag,abbr_in_flag,abbr_out_flag local number_only_flag,out_number_only_flag,out_unit_only_flag=false,false,false --[[ lk判断 --]] if lk=="off" then lk_in_flag,lk_out_flag=false,false elseif lk=="in" then lk_in_flag,lk_out_flag=true,false elseif lk=="out" then lk_in_flag,lk_out_flag=false,true elseif lk=="on" then lk_in_flag,lk_out_flag=true,true end --[[ abbr判断 --]] if abbr=="off" then abbr_in_flag,abbr_out_flag=false,false elseif abbr=="in" then abbr_in_flag,abbr_out_flag=true,false elseif abbr=="out" then abbr_in_flag,abbr_out_flag=false,true elseif abbr=="on" then abbr_in_flag,abbr_out_flag=true,true elseif abbr=="values" then abbr_in_flag,abbr_out_flag=false,false number_only_flag=true end --[[ 生成单位的输出代码 --]] local inunit_code=Convert.link_builder( lk_in_flag, group_name, in_unit, Convert.display_builder( group_name, in_unit, abbr_in_flag ) ) inunit_code=(number_only_flag and "") or inunit_code local outunit_code=Convert.link_builder( lk_out_flag, group_name, out_unit, Convert.display_builder( group_name, out_unit, abbr_out_flag ) ) if(not(disp=="output only") and number_only_flag) then outunit_code="" end --[[ disp判断输出 --]] local divisionA,divisionB="(",")" if disp=="output only" then -- if number_only_flag then -- inunit_code="" -- end -- in_num="" -- out={in_num,inunit_code,divisionA,out_num,outunit_code,divisionB} out={out_num,outunit_code} return table.concat(out) elseif disp=="output number only" then -- inunit_code="" -- in_num="" -- outunit_code="" -- out={in_num,inunit_code,divisionA,out_num,outunit_code,divisionB} out={out_num} return table.concat(out) elseif disp=="or" then--disp=or divisionA,divisionB="或","" out={in_num,inunit_code,divisionA,out_num,outunit_code,divisionB} return table.concat(out) elseif disp=="b" then--disp=b,默认 divisionA,divisionB="(",")" out={in_num,inunit_code,divisionA,out_num,outunit_code,divisionB} return table.concat(out) elseif disp=="comma" then--disp=comma divisionA,divisionB=",","" out={in_num,inunit_code,divisionA,out_num,outunit_code,divisionB} return table.concat(out) elseif disp=="x" then --disp=x local t_mark=0--存在索引参数有效位数的偏移标记 if args["sigfig_inindex"]~=nil then--存在则为1 t_mark=1 end local last_mark=args["last_mark"] local t_divisionA,t_divisionB=args[last_mark+t_mark+1],args[last_mark+t_mark+2]--读取倒数最后一到两位(对应disp=x时后两位的位置) if t_divsionB==nil then t_divsionB="" end divisionA,divisionB=t_divisionA,t_divisionB out={in_num,inunit_code,divisionA,out_num,outunit_code,divisionB} return table.concat(out) elseif disp=="filp" then--disp=filp out={out_num,outunit_code,divisionA,in_num,inunit_code,divisionB} return table.concat(out) elseif disp=="unit" then--disp=unit if in_num==1 then outunit_code=Convert.link_builder(lk_out_flag,group_name,out_unit,Convert.display_builder(group_name,out_unit,false)) else outunit_code=Convert.link_builder(lk_out_flag,group_name,out_unit,Convert.display_builder(group_name,out_unit,true)) end out={in_num,inunit_code,divisionA,out_num,outunit_code,divisionB} return table.concat(out) elseif disp=="table" then--disp=table local temp="" if args["sortable"]~=nil then --代替调用{{ntsh}},效果等价 temp=string.format([[<span style="display:none">%016.6f</span>]],in_num) end out={"|",temp,in_num,"||",out_num} return table.concat(out) else out={in_num,inunit_code,divisionA,out_num,outunit_code,divisionB} return table.concat(out) end end --[[ 处理温度间转换1个处理单元 --]] function Convert.bind_1_tempRange(args) --锁定锚点 local mark=args["mark"] --初始化数值,单位,转换方法 local in_num,out_num=tonumber(args[mark-1]),0 local in_unit,out_unit,group_name=nil,nil,args["group"] if args[mark]=="C-change" then--温度转换 in_unit,out_unit="C","F" else in_unit,out_unit="F","C" end local function_convert=Convert.convert_builder(group_name,in_unit,out_unit) --换算中 out_num=function_convert(in_num) --有效位数计算 local sigfig=0 if args["sigfig_inindex"]~=nil then sigfig=tonumber(args["sigfig_inindex"]) elseif args["sigfig"] then sigfig=tonumber(args["sigfig"]) end local function_sigfig=Convert.sigfig_func if args["disp"]=="5" then function_sigfig=Convert.sigfig5_func end out_num=function_sigfig(out_num,sigfig) --输出 --输出准备 local out --读取lk,abbr,disp local lk,abbr,disp=args["lk"],args["abbr"],args["disp"] local lk_in_flag,lk_out_flag,abbr_in_flag,abbr_out_flag local number_only_flag,out_number_only_flag,out_unit_only_flag=false,false,false --[[ lk判断 --]] if lk=="off" then lk_in_flag,lk_out_flag=false,false elseif lk=="in" then lk_in_flag,lk_out_flag=true,false elseif lk=="out" then lk_in_flag,lk_out_flag=false,true elseif lk=="on" then lk_in_flag,lk_out_flag=true,true end --[[ abbr判断 --]] if abbr=="off" then abbr_in_flag,abbr_out_flag=false,false elseif abbr=="in" then abbr_in_flag,abbr_out_flag=true,false elseif abbr=="out" then abbr_in_flag,abbr_out_flag=false,true elseif abbr=="on" then abbr_in_flag,abbr_out_flag=true,true elseif abbr=="values" then abbr_in_flag,abbr_out_flag=false,false number_only_flag=true end --[[ 生成单位的输出代码 --]] local inunit_code=Convert.link_builder( lk_in_flag, group_name, in_unit, Convert.display_builder( group_name, in_unit, abbr_in_flag ) ) inunit_code=(number_only_flag and "") or inunit_code local outunit_code=Convert.link_builder( lk_out_flag, group_name, out_unit, Convert.display_builder( group_name, out_unit, abbr_out_flag ) ) if(not(disp=="output only") and number_only_flag) then outunit_code="" end --[[ disp判断输出 --]] local divisionA,divisionB="(",")" if disp=="output only" then -- if number_only_flag then -- inunit_code="" -- end -- in_num="" -- out={in_num,inunit_code,divisionA,out_num,outunit_code,divisionB} out={out_num,outunit_code} return table.concat(out) elseif disp=="output number only" then -- inunit_code="" -- in_num="" -- outunit_code="" -- out={in_num,inunit_code,divisionA,out_num,outunit_code,divisionB} out={out_num} return table.concat(out) elseif disp=="or" then--disp=or divisionA,divisionB="或","" out={in_num,inunit_code,divisionA,out_num,outunit_code,divisionB} return table.concat(out) elseif disp=="b" then--disp=b,默认 divisionA,divisionB="(",")" out={in_num,inunit_code,divisionA,out_num,outunit_code,divisionB} return table.concat(out) elseif disp=="comma" then--disp=comma divisionA,divisionB=",","" out={in_num,inunit_code,divisionA,out_num,outunit_code,divisionB} return table.concat(out) elseif disp=="x" then --disp=x local t_mark=0--存在索引参数有效位数的偏移标记 if args["sigfig_inindex"]~=nil then--存在则为1 t_mark=1 end local last_mark=args["last_mark"] local t_divisionA,t_divisionB=args[last_mark+t_mark+1],args[last_mark+t_mark+2]--读取倒数最后一到两位(对应disp=x时后两位的位置) if t_divsionB==nil then t_divsionB="" end divisionA,divisionB=t_divisionA,t_divisionB out={in_num,inunit_code,divisionA,out_num,outunit_code,divisionB} return table.concat(out) elseif disp=="filp" then out={out_num,outunit_code,divisionA,in_num,inunit_code,divisionB} return table.concat(out) elseif disp=="unit" then if in_num==1 then outunit_code=Convert.link_builder(lk_out_flag,group_name,out_unit,Convert.display_builder(group_name,out_unit,false)) else outunit_code=Convert.link_builder(lk_out_flag,group_name,out_unit,Convert.display_builder(group_name,out_unit,true)) end out={in_num,inunit_code,divisionA,out_num,outunit_code,divisionB} return table.concat(out) elseif disp=="table" then local temp="" if args["sortable"]~=nil then --代替调用{{ntsh}},效果等价 temp=string.format([[<span style="display:none">%016.6f</span>]],in_num) end out={"|",temp,in_num,"||",out_num} return table.concat(out) else out={in_num,inunit_code,divisionA,out_num,outunit_code,divisionB} return table.concat(out) end end --[[ 处理组合输入1个处理单元 --]] function Convert.bind_1_intogether(args) --锁定锚点 local mark=args["mark"] --初始化数值,单位,转换方法 local in_num,out_num={tonumber(args[mark-1]),tonumber(args[mark+1])},0 local in_unit,out_unit,group_name={args[mark],args[mark+2]},args[mark+3],args["group"] local function_convert={} for k,v in pairs(in_unit) do function_convert[k]=Convert.convert_builder(group_name,v,out_unit) end --换算中 for k,v in pairs(in_num) do out_num=out_num+function_convert[k](in_num[k]) end --有效位数计算 local sigfig=0 if args["sigfig_inindex"]~=nil then sigfig=tonumber(args["sigfig_inindex"]) elseif args["sigfig"] then sigfig=tonumber(args["sigfig"]) end local function_sigfig=Convert.sigfig_func if args["disp"]=="5" then function_sigfig=Convert.sigfig5_func end out_num=function_sigfig(out_num,sigfig) --输出 --输出准备 local out --读取lk,abbr,disp local lk,abbr,disp=args["lk"],args["abbr"],args["disp"] local lk_in_flag,lk_out_flag,abbr_in_flag,abbr_out_flag local number_only_flag,out_number_only_flag,out_unit_only_flag=false,false,false --[[ lk判断 --]] if lk=="off" then lk_in_flag,lk_out_flag=false,false elseif lk=="in" then lk_in_flag,lk_out_flag=true,false elseif lk=="out" then lk_in_flag,lk_out_flag=false,true elseif lk=="on" then lk_in_flag,lk_out_flag=true,true end --[[ abbr判断 --]] if abbr=="off" then abbr_in_flag,abbr_out_flag=false,false elseif abbr=="in" then abbr_in_flag,abbr_out_flag=true,false elseif abbr=="out" then abbr_in_flag,abbr_out_flag=false,true elseif abbr=="on" then abbr_in_flag,abbr_out_flag=true,true elseif abbr=="values" then abbr_in_flag,abbr_out_flag=false,false number_only_flag=true end --[[ 生成单位的输出代码 --]] local inunit_code={} for k,v in pairs(in_unit) do inunit_code[k]=Convert.link_builder( lk_in_flag, group_name, v, Convert.display_builder( group_name, v, abbr_in_flag ) ) end inunit_code=(number_only_flag and {}) or inunit_code local outunit_code=Convert.link_builder(lk_out_flag,group_name,out_unit,Convert.display_builder(group_name,out_unit,abbr_out_flag)) if(not(disp=="output only") and number_only_flag) then outunit_code="" end --[[ disp判断输出 --]] local divisionA,divisionB="(",")" if disp=="output only" then -- if number_only_flag then -- inunit_code={"",""} -- end -- in_num={"",""} -- out={in_num[1],inunit_code[1],in_num[2],inunit_code[2],divisionA,out_num,outunit_code,divisionB} out={out_num,outunit_code} return table.concat(out) elseif disp=="output number only" then -- inunit_code={"",""} -- in_num={"",""} -- outunit_code="" -- out={in_num[1],inunit_code[1],in_num[2],inunit_code[2],divisionA,out_num,outunit_code,divisionB} out={out_num} return table.concat(out) elseif disp=="or" then--disp=or divisionA,divisionB="或","" out={in_num[1],inunit_code[1],in_num[2],inunit_code[2],divisionA,out_num,outunit_code,divisionB} return table.concat(out) elseif disp=="b" then--disp=b,默认 divisionA,divisionB="(",")" out={in_num[1],inunit_code[1],in_num[2],inunit_code[2],divisionA,out_num,outunit_code,divisionB} return table.concat(out) elseif disp=="comma" then--disp=comma divisionA,divisionB=",","" out={in_num[1],inunit_code[1],in_num[2],inunit_code[2],divisionA,out_num,outunit_code,divisionB} return table.concat(out) elseif disp=="x" then --disp=x local t_mark=0--存在索引参数有效位数的偏移标记 if args["sigfig_inindex"]~=nil then--存在则为1 t_mark=1 end local last_mark=args["last_mark"] local t_divisionA,t_divisionB=args[last_mark+t_mark+1],args[last_mark+t_mark+2]--读取倒数最后一到两位(对应disp=x时后两位的位置) if t_divsionB==nil then t_divsionB="" end divisionA,divisionB=t_divisionA,t_divisionB out={in_num[1],inunit_code[1],in_num[2],inunit_code[2],divisionA,out_num,outunit_code,divisionB} return table.concat(out) elseif disp=="filp" then--disp=filp out={out_num,outunit_code,divisionA,in_num[1],inunit_code[1],in_num[2],inunit_code[2],divisionB} return table.concat(out) elseif disp=="unit" then--disp=unit if in_num==1 then outunit_code=Convert.link_builder(lk_out_flag,group_name,out_unit,Convert.display_builder(group_name,out_unit,false)) else outunit_code=Convert.link_builder(lk_out_flag,group_name,out_unit,Convert.display_builder(group_name,out_unit,true)) end out={in_num[1],inunit_code[1],in_num[2],inunit_code[2],divisionA,out_num,outunit_code,divisionB} return table.concat(out) elseif disp=="table" then--disp=table local temp="" if args["sortable"]~=nil then --代替调用{{ntsh}},效果等价 temp=string.format([[<span style="display:none">%016.6f</span>]],in_num) end out={"|",temp,in_num[1],",",in_num[2],"||",out_num} return table.concat(out) else out={in_num[1],inunit_code[1],in_num[2],inunit_code[2],divisionA,out_num,outunit_code,divisionB} return table.concat(out) end end --[[ 处理组合输出1个处理单元 --]] function Convert.bind_1_outtogether(args) --锁定锚点 local mark=args["mark"] --初始化数值,单位,转换方法 local in_num,out_num=tonumber(args[mark-1]),{} local in_unit,out_unit,group_name=args[mark],args["outputtogether"],args["group"] local function_convert={} for k,v in pairs(out_unit) do function_convert[k]=Convert.convert_builder(group_name,in_unit,v) end --换算中 for k,v in pairs(function_convert) do out_num[k]=v(in_num) end --有效位数计算 local sigfig=0 if args["sigfig_inindex"]~=nil then sigfig=tonumber(args["sigfig_inindex"]) elseif args["sigfig"] then sigfig=tonumber(args["sigfig"]) end local function_sigfig=Convert.sigfig_func if args["disp"]=="5" then function_sigfig=Convert.sigfig5_func end for k,v in pairs(out_unit) do out_num[k]=function_sigfig(out_num[k],sigfig) end --输出 --输出准备 local out --读取lk,abbr,disp local lk,abbr,disp=args["lk"],args["abbr"],args["disp"] local lk_in_flag,lk_out_flag,abbr_in_flag,abbr_out_flag local number_only_flag,out_number_only_flag,out_unit_only_flag=false,false,false --[[ lk判断 --]] if lk=="off" then lk_in_flag,lk_out_flag=false,false elseif lk=="in" then lk_in_flag,lk_out_flag=true,false elseif lk=="out" then lk_in_flag,lk_out_flag=false,true elseif lk=="on" then lk_in_flag,lk_out_flag=true,true end --[[ abbr判断 --]] if abbr=="off" then abbr_in_flag,abbr_out_flag=false,false elseif abbr=="in" then abbr_in_flag,abbr_out_flag=true,false elseif abbr=="out" then abbr_in_flag,abbr_out_flag=false,true elseif abbr=="on" then abbr_in_flag,abbr_out_flag=true,true elseif abbr=="values" then abbr_in_flag,abbr_out_flag=false,false number_only_flag=true end --[[ 生成单位的输出代码 --]] local inunit_code=Convert.link_builder(lk_in_flag,group_name,in_unit,Convert.display_builder(group_name,in_unit,abbr_in_flag)) inunit_code=(number_only_flag and "") or inunit_code local outunit_code={} for k,v in pairs(out_unit) do outunit_code[k]=Convert.link_builder( lk_out_flag, group_name, v, Convert.display_builder( group_name, v, abbr_out_flag ) ) end if(not(disp=="output only") and number_only_flag) then outunit_code={} end --[[ disp判断输出 --]] local divisionA,divisionB="(",")" if disp=="output only" then -- if number_only_flag then -- inunit_code="" -- end -- in_num="" -- out={in_num,inunit_code,divisionA,out_num[1],outunit_code[1],",",out_num[2],outunit_code[2],divisionB} out={out_num[1],outunit_code[1],",",out_num[2],outunit_code[2]} return table.concat(out) elseif disp=="output number only" then -- inunit_code="" -- in_num="" -- outunit_code={"",""} -- out={in_num,inunit_code,divisionA,out_num[1],outunit_code[1],",",out_num[2],outunit_code[2],divisionB} out={out_num[1]",",out_num[2]} return table.concat(out) elseif disp=="or" then--disp=or divisionA,divisionB="或","" out={in_num,inunit_code,divisionA,out_num[1],outunit_code[1],",",out_num[2],outunit_code[2],divisionB} return table.concat(out) elseif disp=="b" then--disp=b,默认 divisionA,divisionB="(",")" out={in_num,inunit_code,divisionA,out_num[1],outunit_code[1],",",out_num[2],outunit_code[2],divisionB} return table.concat(out) elseif disp=="comma" then--disp=comma divisionA,divisionB=",","" out={in_num,inunit_code,divisionA,out_num[1],outunit_code[1],",",out_num[2],outunit_code[2],divisionB} return table.concat(out) elseif disp=="x" then --disp=x local t_mark=0--存在索引参数有效位数的偏移标记 if args["sigfig_inindex"]~=nil then--存在则为1 t_mark=1 end local last_mark=args["last_mark"] local t_divisionA,t_divisionB=args[last_mark+t_mark+1],args[last_mark+t_mark+2]--读取倒数最后一到两位(对应disp=x时后两位的位置) if t_divsionB==nil then t_divsionB="" end divisionA,divisionB=t_divisionA,t_divisionB out={in_num,inunit_code,divisionA,out_num[1],outunit_code[1],",",out_num[2],outunit_code[2],divisionB} return table.concat(out) elseif disp=="filp" then--disp=filp out={out_num[1],outunit_code[1],",",out_num[2],outunit_code[2],divisionA,in_num,inunit_code,divisionB} return table.concat(out) elseif disp=="unit" then--disp=unit if in_num==1 then for k,v in pairs(out_unit) do outunit_code[k]=Convert.link_builder( lk_out_flag, group_name, v, Convert.display_builder( group_name, v, false ) ) end else for k,v in pairs(out_unit) do outunit_code[k]=Convert.link_builder( lk_out_flag, group_name, v, Convert.display_builder( group_name, v, true ) ) end end out={in_num,inunit_code,divisionA,out_num[1],outunit_code[1],",",out_num[2],outunit_code[2],divisionB} return table.concat(out) elseif disp=="table" then--disp=table local temp="" if args["sortable"]~=nil then --代替调用{{ntsh}},效果等价 temp=string.format([[<span style="display:none">%016.6f</span>]],in_num) end out={"|",temp,in_num,"||",out_num[1],",",outunit_code[2]} return table.concat(out) else out={in_num,inunit_code,divisionA,out_num[1],outunit_code[1],",",out_num[2],outunit_code[2],divisionB} return table.concat(out) end end --[[ 处理普通2个处理单元 --]] function Convert.bind_2(args) --锁定锚点 local mark=args["mark"] --初始化数值,单位,转换方法 local in_num,out_num={},{} local embellish=args["embellish"] local in_unit,out_unit,group_name=args[mark],args[mark+1],args["group"] local function_convert=Convert.convert_builder(group_name,in_unit,out_unit) --数据初始化 for i=1,mark,2 do local key=#in_num+1 in_num[key],out_num[key]=args[i],0 end --换算中 for k,v in pairs(in_num) do out_num[k]=function_convert(v) end --有效位数计算 local sigfig=0 if args["sigfig_inindex"]~=nil then sigfig=tonumber(args["sigfig_inindex"]) elseif args["sigfig"] then sigfig=tonumber(args["sigfig"]) end local function_sigfig=Convert.sigfig_func if args["disp"]=="5" then function_sigfig=Convert.sigfig5_func end for k,v in pairs(out_num) do out_num[k]=function_sigfig(v,sigfig) end --输出 --输出准备 local out={} --读取lk,abbr,disp local lk,abbr,disp=args["lk"],args["abbr"],args["disp"] local lk_in_flag,lk_out_flag,abbr_in_flag,abbr_out_flag local number_only_flag,out_number_only_flag,out_unit_only_flag=false,false,false --[[ lk判断 --]] if lk=="off" then lk_in_flag,lk_out_flag=false,false elseif lk=="in" then lk_in_flag,lk_out_flag=true,false elseif lk=="out" then lk_in_flag,lk_out_flag=false,true elseif lk=="on" then lk_in_flag,lk_out_flag=true,true end --[[ abbr判断 --]] if abbr=="off" then abbr_in_flag,abbr_out_flag=false,false elseif abbr=="in" then abbr_in_flag,abbr_out_flag=true,false elseif abbr=="out" then abbr_in_flag,abbr_out_flag=false,true elseif abbr=="on" then abbr_in_flag,abbr_out_flag=true,true elseif abbr=="values" then abbr_in_flag,abbr_out_flag=false,false number_only_flag=true end --[[ 生成单位的输出代码 --]] local inunit_code=Convert.link_builder(lk_in_flag,group_name,in_unit,Convert.display_builder(group_name,in_unit,abbr_in_flag)) inunit_code=(number_only_flag and "") or inunit_code local outunit_code=Convert.link_builder(lk_out_flag,group_name,out_unit,Convert.display_builder(group_name,out_unit,abbr_out_flag)) if(not(disp=="output only") and number_only_flag) then outunit_code="" end --[[ disp判断输出 --]] local divisionA,divisionB="(",")" if disp=="output only" then -- if number_only_flag then -- inunit_code="" -- end -- in_num={} -- for k,v in pairs(in_num) do -- table.insert(out,v) -- if k<#embellish then -- table.insert(out,embellish[k]) -- end -- end -- table.insert(out,inunit_code) -- table.insert(out,divisionA) for k,v in pairs(out_num) do table.insert(out,v) if k<#embellish then table.insert(out,embellish[k]) end end table.insert(out,outunit_code) -- table.insert(out,divisionB) return table.concat(out) elseif disp=="output number only" then -- inunit_code="" -- in_num={} -- outunit_code="" -- for k,v in pairs(in_num) do -- table.insert(out,v) -- if k<#embellish then -- table.insert(out,embellish[k]) -- end -- end -- table.insert(out,inunit_code) -- table.insert(out,divisionA) for k,v in pairs(out_num) do table.insert(out,v) if k<#embellish then table.insert(out,embellish[k]) end end -- table.insert(out,divisionB) return table.concat(out) elseif disp=="or" then--disp=or divisionA,divisionB="或","" for k,v in pairs(in_num) do table.insert(out,v) if k<=#embellish then table.insert(out,embellish[k]) end end table.insert(out,inunit_code) table.insert(out,divisionA) for k,v in pairs(out_num) do table.insert(out,v) if k<=#embellish then table.insert(out,embellish[k]) end end table.insert(out,outunit_code) table.insert(out,divisionB) return table.concat(out) elseif disp=="b" then--disp=b,默认 divisionA,divisionB="(",")" for k,v in pairs(in_num) do table.insert(out,v) if k<=#embellish then table.insert(out,embellish[k]) end end table.insert(out,inunit_code) table.insert(out,divisionA) for k,v in pairs(out_num) do table.insert(out,v) if k<=#embellish then table.insert(out,embellish[k]) end end table.insert(out,outunit_code) table.insert(out,divisionB) return table.concat(out) elseif disp=="comma" then--disp=comma divisionA,divisionB=",","" for k,v in pairs(in_num) do table.insert(out,v) if k<#embellish then table.insert(out,embellish[k]) end end table.insert(out,inunit_code) table.insert(out,divisionA) for k,v in pairs(out_num) do table.insert(out,v) if k<#embellish then table.insert(out,embellish[k]) end end table.insert(out,outunit_code) table.insert(out,divisionB) return table.concat(out) elseif disp=="x" then --disp=x local t_mark=0--存在索引参数有效位数的偏移标记 if args["sigfig_inindex"]~=nil then--存在则为1 t_mark=1 end local last_mark=args["last_mark"] local t_divisionA,t_divisionB=args[last_mark+t_mark+1],args[last_mark+t_mark+2]--读取倒数最后一到两位(对应disp=x时后两位的位置) if t_divsionB==nil then t_divsionB="" end divisionA,divisionB=t_divisionA,t_divisionB for k,v in pairs(in_num) do table.insert(out,v) if k<#embellish then table.insert(out,embellish[k]) end end table.insert(out,inunit_code) table.insert(out,divisionA) for k,v in pairs(out_num) do table.insert(out,v) if k<#embellish then table.insert(out,embellish[k]) end end table.insert(out,outunit_code) table.insert(out,divisionB) return table.concat(out) elseif disp=="filp" then--disp=filp for k,v in pairs(out_num) do table.insert(out,v) if k<#embellish then table.insert(out,embellish[k]) end end table.insert(out,inunit_code) table.insert(out,divisionA) for k,v in pairs(in_num) do table.insert(out,v) if k<#embellish then table.insert(out,embellish[k]) end end table.insert(out,outunit_code) table.insert(out,divisionB) return table.concat(out) elseif disp=="unit" then--disp=unit if in_num==1 then outunit_code=Convert.link_builder(lk_out_flag,group_name,out_unit,Convert.display_builder(group_name,out_unit,false)) else outunit_code=Convert.link_builder(lk_out_flag,group_name,out_unit,Convert.display_builder(group_name,out_unit,true)) end for k,v in pairs(in_num) do table.insert(out,v) if k<#embellish then table.insert(out,embellish[k]) end end table.insert(out,inunit_code) table.insert(out,divisionA) for k,v in pairs(out_num) do table.insert(out,v) if k<#embellish then table.insert(out,embellish[k]) end end table.insert(out,outunit_code) table.insert(out,divisionB) return table.concat(out) elseif disp=="table" then--disp=table local temp="" if args["sortable"]~=nil then --代替调用{{ntsh}},效果等价 temp=string.format([[<span style="display:none">%016.6f</span>]],in_num[1]) end table.insert(out,"|") table.insert(out,temp) for k,v in pairs(in_num) do table.insert(out,v) if k<#embellish then table.insert(out,embellish[k]) end end table.insert(out,"||") for k,v in pairs(out_num) do table.insert(out,v) if k<#embellish then table.insert(out,embellish[k]) end end return table.concat(out) else for k,v in pairs(in_num) do table.insert(out,v) if k<#embellish then table.insert(out,embellish[k]) end end table.insert(out,inunit_code) table.insert(out,divisionA) for k,v in pairs(out_num) do table.insert(out,v) if k<#embellish then table.insert(out,embellish[k]) end end table.insert(out,outunit_code) table.insert(out,divisionB) return table.concat(out) end end --[[ 处理普通3个处理单元 --]] function Convert.bind_3(args) return Convert.bind_2(args) end --[[ 处理普通4个处理单元 --]] function Convert.bind_4(args) return Convert.bind_2(args) end function Convert.main(frame) local args=Convert.init(frame) args=Convert.cheak(args) return Convert.select(args) end return Convert
摘要:
请注意,所有对Local Chinese Wikipedia的贡献均可能会被其他贡献者编辑、修改或删除。如果您不希望您的文字作品被随意编辑,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源(详情请见
Project:著作权
)。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
导航菜单
个人工具
未登录
讨论
贡献
创建账号
登录
命名空间
模块
讨论
English
查看
阅读
编辑
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息