模块:沙盒/cwek/Convert

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