Module: 沙盒 /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 ConvertDate=dofile ("D:\\documents\\Github\\mwlua_convert\\data.lua")

-- local ConvertDate=dofile ("D:\\GitHub\\mwlua_convert\\data.lua")

local Convert_Date=mw.loadData ("模組：沙盒 /cwek/Convert/data")

-- 溫度，基準為 K

--0 為目標轉基準，1 為基準轉目標

-- 從 data.lua 移入

local ConvertDateof_temperature={"value"={"temperature"=}}

ConvertDateof_temperature.value.temperature={

-- 國際單位制

"K"={function (input) return 1input end,function (input) return 1input 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}

}

ConvertDateoftemperature.value.temperature"°C"=ConvertDateoftemperature.value.temperature"C"

ConvertDateoftemperature.value.temperature"°R"=ConvertDateoftemperature.value.temperature"R"

ConvertDateoftemperature.value.temperature"°F"=ConvertDateoftemperature.value.temperature"F"

Convert"temperature_unit"={"K","C","R","F","°C","°R","°F"}

----

-- 特別內容 --

-- 支援 2 值算單值的單位（組合輸入單位）

第一個單位 =,...}

Convert"input_together"={

"ft"=,

"st"=,

"lb"=

}

-- 支援組合輸出單位的

--{單位 ={允許的單位，...},...}

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"="到",

"-"="-"

}

--

從方法開始

--

--

單位查詢方法

--

-- 判斷是否是溫度單位

--@paramunit: 輸入單位名

--@returnfalse|true

functionConvert.istemperatureunit (unit)

fork,vinpairs (ConvertDateof_temperature.value.temperature) do

ifk==unitthen

returntrue

end

end

returnfalse

end

-- 獲得溫度的換算器

--@paramunit: 輸入的溫度單位名

--@return 溫度單位的換算函式陣列

functionConvert.gettemperatureunit_Convert (unit)

returnConvertDateof_temperature.value.temperatureunit

end

-- 單個單位檢查工具

--@paramunit: 輸入單位名

--@return,true

functionConvert.unit_check (unit)

localflag=false

localgroup=nil

if (tonumber (unit)~=nil) then

returngroup,flag

end

fork,groupnameinpairs (Convert.groupname) do

ifgroup_name=="temperature"then-- 針對溫度

ifConvert.istemperatureunit (unit) then

return"temperature",true

end

else

forunitname,vinpairs (ConvertDate.valuegroup_name) do-- 通常，其他

ifunit_name==unitthen

group=group_name

flag=true

returngroup,flag

end

end

end

end

returngroup,flag

end

-- 單位轉換值查詢

--@paramgroup: 單位所屬組

--@paramunit: 輸入單位名

--@return 函式陣列（溫度的換算函式）

functionConvert.unitConvertvalue (group,unit)

ifgroup=="temperature"andConvert.istemperatureunit (unit) then

returnConvert.gettemperatureunit_Convert (unit)-- 陣列

else

returnConvert_Date.valuegroupunit-- 數

end

end

-- 檢查輸入的兩個單位是否是組合輸入單位

--@paramunitA: 第一個輸入單位

--@paramunitB: 第二個輸入單位

--@returnfalse|true

functionConvert.isinputtogether (unitA,unitB)

fork1,v1inpairs (Convert.input_together) do

ifk1==unitAthen

fork2,v2inpairs (v1) do

if (v21==unitAandv22==unitB) then

returntrue

end

end

end

end

returnfalse

end

-- 檢查輸入的字串是否輸出組合單位

--@paraminput: 輸入的字串

--@returntrue,,

functionConvert.isouttogether (input)

local,,unitA,unitB=string.find (input,"(% a+)% s (% a+)")

localgroupA,flagA=Convert.unit_check (unitA)

localgroupB,flagB=Convert.unit_check (unitB)

if (flagAandflagB) andgroupA==groupBthen

returntrue,unitA,unitB

else

returnfalse,nil,nil

end

end

-- 根據組查閱組的基準單位

--@paramgroup: 單位組名

--@returnnil

functionConvert.base_unit (group)

fork,vinpairs (Convert.group_name) do

ifv==groupthen

returnConvert.baseunitk

end

end

returnnil

end

--

構造類方法

--

-- 修飾詞確認和查詢對應

--@paraminput: 輸入檢查字串

--@return 對應的修飾詞，true

functionConvert.embellish (input)

fork,vinpairs (Convert.range_embellish) do

ifk==inputthen

returnConvert.range_embellishk,true

end

end

returninput,false

end

-- 單位連結值查詢

--@paramgroup: 單位組名

--@paramunit: 單位名

--@return

functionConvert.link_finder (group,unit)

fork,vinpairs (Convert_Date.linkgroup) do

locallinkname=k

fork,tinpairs (v) do

ifunit==tthen

returnlinkname

end

end

end

returnfalse

end

-- 單位連結值建造

--@paramflag: 顯示連結標記旗

--@paramgroup: 單位組名

--@paramunit: 單位名

--@paramdisplay: 顯示值

--@return

functionConvert.link_builder (flag,group,unit,display)

localcode

localt=Convert.link_finder (group,unit)

if (flagandt~=false) then

code=""..display..""

else

code=display

end

returncode

end

-- 單位顯示值建造（中文全稱或縮名）

--@paramgroup: 單位組名

--@paramunit: 單位名

--@paramflag: 顯示全程或縮名標記旗

--@return

functionConvert.display_builder (group,unit,flag)

localtarr=ConvertDate.displaygroupunit

if (notflag) or (flagandt_arr2==nil) then

returnt_arr1-- 全名

else

returnt_arr2-- 縮名

end

end

-- 取整

--@paraminput: 輸入值

--@paramsigfig: 取整數

--@return

functionConvert.sigfig_func (input,sigfig)

localt,_=math.modf (input*math.pow (10,sigfig)+0.5)

		locals=t/math.pow (10,sigfig)

ifsigfig

functionConvert.sigfig5_func (input)

localt=tonumber (Convert.sigfig_func (input,0))

localx=(math.fmod (t,10))

if (x=2.5andx=5andx=7.5) then

returnt+(10-x)

end

end

-- 轉換引數建構函式

--@paramgroup: 單位組名

--@paramin_unit: 輸入單位

--@paramout_unit: 輸出單位

--@return

functionConvert.convertbuilder (group,inunit,out_unit)

locala_t

localb_t

ifConvert.istemperatureunit (inunit) andConvert.istemperatureunit (outunit) then

at=Convert.gettemperatureunitConvert (in_unit)

bt=Convert.gettemperatureunitConvert (out_unit)

else

at=ConvertDate.valuegroupin_unit

bt=ConvertDate.valuegroupout_unit

end

iftype (at)=="number"andtype (bt)=="number"then-- 如果是普通數（非溫度類）

locala,b=at,bt

returnfunction (input) returninput*a/bend

else-- 溫度類的處理

localaK,Kb=at1,bt2

returnfunction (input) returnKb (aK (input)) end

end

end

--

主方法開始

--

-- 傳入引數初始化

--@paramframe:mw.frame

--@return

--functionConvert.init (args)

--localargsfromtemplate=args

functionConvert.init (frame)

localargsfromtemplate=frame:getParent .args

localargs={- 準備載具

for k,v in pairs (argsfromtemplate) do

if (tonumber (k)~=nil) then

argstonumber (k)=v

else

argsk=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 tunitgroup=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==argst_mark then

--t_processCount=1

args"processCount"=t_processCount

args"group"="temperature"

args"temperature_range"=v

args"mark"=t_mark

args"lastmark"=tmark-- 離索引引數有效位最後前一位

if tonumber (argsargs"last_mark"+1)~=nil then-- 使用索引引數標記有效位，記錄

args"sigfiginindex"=tonumber (argsargs"lastmark"+1)

end

--print ("TR ok")

return args

end

end

--print ("TR miss")

groupA,flagA=Convert.unitcheck (argstmark);

if flagA==true then-- 確認第一個是單位，以區分聯絡詞（2 個處理單元）

-- 確認是不是組合輸入（索引引數 4 是不是同組單位）

if Convert.isinputtogether (argstmark,argstmark+2) then

groupB,flagB=Convert.unitcheck (argstmark+3)

if groupB==groupA and flagB then

args"processCount"=t_processCount

args"group"=groupA

args"inputtogether"=true

args"mark"=t_mark

args"lastmark"=tmark+3-- 離索引引數有效位最後前一位

if tonumber (argsargs"last_mark"+1)~=nil then-- 使用索引引數標記有效位，記錄

args"sigfiginindex"=tonumber (argsargs"lastmark"+1)

end

--print ("IT ok")

return args

end

end

--print ("IT miss")

-- 索引 3 為空或索引 3 為數字（索引約位數）

if argstmark+1==nil or tonumber (argstmark+1)~=nil then

local targs3=argstmark+1 or nil-- 讀出引數 3

local outunit=Convert.baseunit (groupA)-- 查出輸入單位所屬基準單位

-- 替換掉

argstmark+1=outunit

argstmark+2=targs3

end

-- 確認是不是組合輸出（索引陣列 3 是不是同組單位）

local outtogetherflag,unitA,unitB=Convert.isouttogether (argst_mark+1)

if outtogetherflag 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"lastmark"=tmark+1-- 離索引引數有效位最後前一位

if tonumber (argsargs"last_mark"+1)~=nil then-- 使用索引引數標記有效位，記錄

args"sigfiginindex"=tonumber (argsargs"lastmark"+1)

end

--print ("OT ok")

return args

end

end

--print ("OT miss")

-- 確認是不是普通的 1 個單元處理（索引陣列 3）

groupB,flagB=Convert.unitcheck (argstmark+1)

if flagB and groupB==groupA then

args"processCount"=t_processCount

args"group"=groupA

args"mark"=t_mark

args"lastmark"=tmark+1-- 離索引引數有效位最後前一位

if tonumber (argsargs"last_mark"+1)~=nil then-- 使用索引引數標記有效位，記錄

args"sigfiginindex"=tonumber (argsargs"lastmark"+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,flagembellish=Convert.embellish (argstmark-2)-- 確認索引陣列 2 是不是修飾詞並獲得修飾詞

----if Convert.embellish (argst_mark-2) then

args"embellish"1=embellish

----end

-- 檢查索引 4 和索引 5 是否是單位，是則確認為 2 個處理數

groupA,flagA=Convert.unitcheck (argstmark)

groupB,flagB=Convert.unitcheck (argstmark+1)

if groupA==groupB and (flagA and flagB) then

args"processCount"=t_processCount

args"group"=groupA

args"mark"=t_mark

args"lastmark"=tmark+1-- 離索引引數有效位最後前一位

if tonumber (argsargs"last_mark"+1)~=nil then-- 使用索引引數標記有效位，記錄

args"sigfiginindex"=tonumber (argsargs"lastmark"+1)

end

--print ("P2 ok")

return args

end

--print ("P2 miss")

--

檢查是否 3 個處理單元

--

t_mark=6-- 鎖定檢查索引 4

t_processCount=3

embellish,flagembellish=Convert.embellish (argstmark-2)-- 確認索引陣列 2 是不是修飾詞並獲得修飾詞

----if Convert.embellish (argst_mark-2) then

args"embellish"2=embellish

----end

-- 檢查索引 6 和索引 7 是否是單位，是則確認為 2 個處理數

groupA,flagA=Convert.unitcheck (argstmark)

groupB,flagB=Convert.unitcheck (argstmark+1)

if groupA==groupB and (flagA and flagB) then

args"processCount"=t_processCount

args"group"=groupA

args"mark"=t_mark

args"lastmark"=tmark+1-- 離索引引數有效位最後前一位

if tonumber (argsargs"last_mark"+1)~=nil then-- 使用索引引數標記有效位，記錄

args"sigfiginindex"=tonumber (argsargs"lastmark"+1)

end

--print ("P3 ok")

return args

end

--print ("P3 miss")

--

檢查是否 4 個處理單元

--

t_mark=8-- 鎖定檢查索引 6

t_processCount=4

embellish,flagembellish=Convert.embellish (argstmark-2)-- 確認索引陣列 2 是不是修飾詞並獲得修飾詞

----if Convert.embellish (argst_mark-2) then

args"embellish"3=embellish

----end

-- 檢查索引 6 和索引 7 是否是單位，是則確認為 2 個處理數

groupA,flagA=Convert.unitcheck (argstmark)

groupB,flagB=Convert.unitcheck (argstmark+1)

if groupA==groupB and (flagA and flagB) then

args"processCount"=t_processCount

args"group"=groupA

args"mark"=t_mark

args"lastmark"=tmark+1-- 離索引引數有效位最後前一位

if tonumber (argsargs"last_mark"+1)~=nil then-- 使用索引引數標記有效位，記錄

args"sigfiginindex"=tonumber (argsargs"lastmark"+1)

end

--print ("P4 ok")

return args

end

--print ("ALL miss")

args"error"="沒找到匹配模式，請檢查引數格式是否正確"

-- 結束

return args

end

--

選擇並執行對應的轉換模式方法

@param 負載陣列

@return 顯示程式碼

--

function Convert.select (args)

local switch=

switch1=Convert.bind_1

switch2=Convert.bind_2

switch3=Convert.bind_3

switch4=Convert.bind_4

switch"temperaturerange"=Convert.bind1_tempRange

switch"inputtogether"=Convert.bind1intogether

switch"outputtogether"=Convert.bind1outtogether

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 switchflag (args)

end

-- 輸出錯誤

function Convert.bind_error (args)

return String.format ('% s',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 innum,outnum=tonumber (argsmark-1),0

local inunit,outunit,group_name=argsmark,argsmark+1,args"group"

local functionconvert=Convert.convertbuilder (groupname,inunit,out_unit)

-- 換算中

outnum=functionconvert (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 functionsigfig=Convert.sigfigfunc

if args"disp"=="5" then

functionsigfig=Convert.sigfig5func

end

outnum=functionsigfig (out_num,sigfig)

-- 輸出

-- 輸出準備

local out

-- 讀取 lk，abbr，disp

local lk,abbr,disp=args"lk",args"abbr",args"disp"

local lkinflag,lkoutflag,abbrinflag,abbroutflag

local numberonlyflag,outnumberonlyflag,outunitonlyflag=false,false,false

--

lk 判斷

--

if lk=="off" then

lkinflag,lkoutflag=false,false

elseif lk=="in" then

lkinflag,lkoutflag=true,false

elseif lk=="out" then

lkinflag,lkoutflag=false,true

elseif lk=="on" then

lkinflag,lkoutflag=true,true

end

--

abbr 判斷

--

if abbr=="off" then

abbrinflag,abbroutflag=false,false

elseif abbr=="in" then

abbrinflag,abbroutflag=true,false

elseif abbr=="out" then

abbrinflag,abbroutflag=false,true

elseif abbr=="on" then

abbrinflag,abbroutflag=true,true

elseif abbr=="values" then

abbrinflag,abbroutflag=false,false

numberonlyflag=true

end

--

生成單位的輸出程式碼

--

local inunitcode=Convert.linkbuilder (

lkinflag,

group_name,

in_unit,

Convert.display_builder (

group_name,

in_unit,

abbrinflag

)

)

inunitcode=(numberonlyflag and "") or inunitcode

local outunitcode=Convert.linkbuilder (

lkoutflag,

group_name,

out_unit,

Convert.display_builder (

group_name,

out_unit,

abbroutflag

)

)

if (not (disp=="output only") and numberonlyflag) then

			outunit_code=""

		end

--

disp 判斷輸出

--

local divisionA,divisionB="（","）"

if disp=="output only" then

-- if numberonlyflag then

-- inunit_code=""

-- end

-- in_num=""

-- out={innum,inunitcode,divisionA,outnum,outunitcode,divisionB}

out={outnum,outunitcode}

return table.concat (out)

elseif disp=="output number only" then

-- inunitcode=""-- innum=""

-- outunit_code=""

-- out={innum,inunitcode,divisionA,outnum,outunitcode,divisionB}

out={out_num}

return table.concat (out)

elseif disp=="or" then--disp=or

divisionA,divisionB="或",""

out={innum,inunitcode,divisionA,outnum,outunitcode,divisionB}

return table.concat (out)

elseif disp=="b" then--disp=b，預設

divisionA,divisionB="（","）"

out={innum,inunitcode,divisionA,outnum,outunitcode,divisionB}

return table.concat (out)

elseif disp=="comma" then--disp=comma

divisionA,divisionB="，",""

out={innum,inunitcode,divisionA,outnum,outunitcode,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 lastmark=args"lastmark"

local tdivisionA,tdivisionB=argslastmark+tmark+1,argslastmark+tmark+2-- 讀取倒數最後一到兩位（對應 disp=x 時後兩位的位置）

if t_divsionB==nil then

t_divsionB=""

end

divisionA,divisionB=tdivisionA,tdivisionB

out={innum,inunitcode,divisionA,outnum,outunitcode,divisionB}

return table.concat (out)

elseif disp=="filp" then--disp=filp

out={outnum,outunitcode,divisionA,innum,inunitcode,divisionB}

return table.concat (out)

elseif disp=="unit" then--disp=unit

if in_num==1 then

outunitcode=Convert.linkbuilder (lkoutflag,groupname,outunit,Convert.displaybuilder (groupname,out_unit,false))

else

outunitcode=Convert.linkbuilder (lkoutflag,groupname,outunit,Convert.displaybuilder (groupname,out_unit,true))

end

out={innum,inunitcode,divisionA,outnum,outunitcode,divisionB}

return table.concat (out)

elseif disp=="table" then--disp=table

local temp=""if args"sortable"~=nil then

-- 代替呼叫，效果等價

temp=string.format (%016.6f,in_num)

end

out={"|",temp,in_num,"

",out_num}

return table.concat (out)

else

out={innum,inunitcode,divisionA,outnum,outunitcode,divisionB}

return table.concat (out)

end

end

--

處理溫度間轉換 1 個處理單元

--

function Convert.bind1tempRange (args)

-- 鎖定錨點

local mark=args"mark"

-- 初始化數值，單位，轉換方法

local innum,outnum=tonumber (argsmark-1),0

local inunit,outunit,group_name=nil,nil,args"group"

if argsmark=="C-change" then-- 溫度轉換

inunit,outunit="C","F"

else

inunit,outunit="F","C"

end

local functionconvert=Convert.convertbuilder (groupname,inunit,out_unit)

-- 換算中

outnum=functionconvert (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 functionsigfig=Convert.sigfigfunc

if args"disp"=="5" then

functionsigfig=Convert.sigfig5func

end

outnum=functionsigfig (out_num,sigfig)

-- 輸出

-- 輸出準備

local out

-- 讀取 lk，abbr，disp

local lk,abbr,disp=args"lk",args"abbr",args"disp"

local lkinflag,lkoutflag,abbrinflag,abbroutflag

local numberonlyflag,outnumberonlyflag,outunitonlyflag=false,false,false

--

lk 判斷

--

if lk=="off" then

lkinflag,lkoutflag=false,false

elseif lk=="in" then

lkinflag,lkoutflag=true,false

elseif lk=="out" then

lkinflag,lkoutflag=false,true

elseif lk=="on" then

lkinflag,lkoutflag=true,true

end

--

abbr 判斷

--

if abbr=="off" then

abbrinflag,abbroutflag=false,false

elseif abbr=="in" then

abbrinflag,abbroutflag=true,false

elseif abbr=="out" then

abbrinflag,abbroutflag=false,true

elseif abbr=="on" then

abbrinflag,abbroutflag=true,true

elseif abbr=="values" then

abbrinflag,abbroutflag=false,false

numberonlyflag=true

end

--

生成單位的輸出程式碼

--

local inunitcode=Convert.linkbuilder (

lkinflag,

group_name,

in_unit,

Convert.display_builder (

group_name,

in_unit,

abbrinflag

)

)

inunitcode=(numberonlyflag and "") or inunitcode

local outunitcode=Convert.linkbuilder (

lkoutflag,

group_name,

out_unit,

Convert.display_builder (

group_name,

out_unit,

abbroutflag

)

)

if (not (disp=="output only") and numberonlyflag) then

			outunit_code=""

		end

--

disp 判斷輸出

--

local divisionA,divisionB="（","）"

if disp=="output only" then

-- if numberonlyflag then

-- inunit_code=""

-- end

-- in_num=""

-- out={innum,inunitcode,divisionA,outnum,outunitcode,divisionB}

out={outnum,outunitcode}

return table.concat (out)

elseif disp=="output number only" then

-- inunitcode=""-- innum=""

-- outunit_code=""

-- out={innum,inunitcode,divisionA,outnum,outunitcode,divisionB}

out={out_num}

return table.concat (out)

elseif disp=="or" then--disp=or

divisionA,divisionB="或",""

out={innum,inunitcode,divisionA,outnum,outunitcode,divisionB}

return table.concat (out)

elseif disp=="b" then--disp=b，預設

divisionA,divisionB="（","）"

out={innum,inunitcode,divisionA,outnum,outunitcode,divisionB}

return table.concat (out)

elseif disp=="comma" then--disp=comma

divisionA,divisionB="，",""

out={innum,inunitcode,divisionA,outnum,outunitcode,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 lastmark=args"lastmark"

local tdivisionA,tdivisionB=argslastmark+tmark+1,argslastmark+tmark+2-- 讀取倒數最後一到兩位（對應 disp=x 時後兩位的位置）

if t_divsionB==nil then

t_divsionB=""

end

divisionA,divisionB=tdivisionA,tdivisionB

out={innum,inunitcode,divisionA,outnum,outunitcode,divisionB}

return table.concat (out)

elseif disp=="filp" then

out={outnum,outunitcode,divisionA,innum,inunitcode,divisionB}

return table.concat (out)

elseif disp=="unit" then

if in_num==1 then

outunitcode=Convert.linkbuilder (lkoutflag,groupname,outunit,Convert.displaybuilder (groupname,out_unit,false))

else

outunitcode=Convert.linkbuilder (lkoutflag,groupname,outunit,Convert.displaybuilder (groupname,out_unit,true))

end

out={innum,inunitcode,divisionA,outnum,outunitcode,divisionB}

return table.concat (out)

elseif disp=="table" then

local temp=""if args"sortable"~=nil then

-- 代替呼叫，效果等價

temp=string.format (%016.6f,in_num)

end

out={"|",temp,in_num,"

",out_num}

return table.concat (out)

else

out={innum,inunitcode,divisionA,outnum,outunitcode,divisionB}

return table.concat (out)

end

end

--

處理組合輸入 1 個處理單元

--

function Convert.bind1intogether (args)

-- 鎖定錨點

local mark=args"mark"

-- 初始化數值，單位，轉換方法

local innum,outnum={tonumber (argsmark-1),tonumber (argsmark+1)},0

local inunit,outunit,group_name={argsmark,argsmark+2},argsmark+3,args"group"

local function_convert=

for k,v in pairs (in_unit) do

functionconvertk=Convert.convertbuilder (groupname,v,outunit)

end

-- 換算中

for k,v in pairs (in_num) do

outnum=outnum+functionconvertk (innumk)

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 functionsigfig=Convert.sigfigfunc

if args"disp"=="5" then

functionsigfig=Convert.sigfig5func

end

outnum=functionsigfig (out_num,sigfig)

-- 輸出

-- 輸出準備

local out

-- 讀取 lk，abbr，disp

local lk,abbr,disp=args"lk",args"abbr",args"disp"

local lkinflag,lkoutflag,abbrinflag,abbroutflag

local numberonlyflag,outnumberonlyflag,outunitonlyflag=false,false,false

--

lk 判斷

--

if lk=="off" then

lkinflag,lkoutflag=false,false

elseif lk=="in" then

lkinflag,lkoutflag=true,false

elseif lk=="out" then

lkinflag,lkoutflag=false,true

elseif lk=="on" then

lkinflag,lkoutflag=true,true

end

--

abbr 判斷

--

if abbr=="off" then

abbrinflag,abbroutflag=false,false

elseif abbr=="in" then

abbrinflag,abbroutflag=true,false

elseif abbr=="out" then

abbrinflag,abbroutflag=false,true

elseif abbr=="on" then

abbrinflag,abbroutflag=true,true

elseif abbr=="values" then

abbrinflag,abbroutflag=false,false

numberonlyflag=true

end

--

生成單位的輸出程式碼

--

local inunit_code=

for k,v in pairs (in_unit) do

inunitcodek=Convert.linkbuilder (

lkinflag,

group_name,

v,

Convert.display_builder (

group_name,

v,

abbrinflag

)

)

end

inunitcode=(numberonlyflag and ) or inunitcode

local outunitcode=Convert.linkbuilder (lkoutflag,groupname,outunit,Convert.displaybuilder (groupname,outunit,abbrout_flag))

if (not (disp=="output only") and numberonlyflag) then

			outunit_code=""

		end

--

disp 判斷輸出

--

local divisionA,divisionB="（","）"

if disp=="output only" then

-- if numberonlyflag then

-- inunit_code={"",""}

-- end

-- in_num={"",""}

-- out={innum1,inunitcode1,innum2,inunitcode2,divisionA,outnum,outunitcode,divisionB}

out={outnum,outunitcode}

return table.concat (out)

elseif disp=="output number only" then

-- inunit_code={"",""}

-- in_num={"",""}

-- outunit_code=""

-- out={innum1,inunitcode1,innum2,inunitcode2,divisionA,outnum,outunitcode,divisionB}

out={out_num}

return table.concat (out)

elseif disp=="or" then--disp=or

divisionA,divisionB="或",""

out={innum1,inunitcode1,innum2,inunitcode2,divisionA,outnum,outunitcode,divisionB}

return table.concat (out)

elseif disp=="b" then--disp=b，預設

divisionA,divisionB="（","）"

out={innum1,inunitcode1,innum2,inunitcode2,divisionA,outnum,outunitcode,divisionB}

return table.concat (out)

elseif disp=="comma" then--disp=comma

divisionA,divisionB="，",""

out={innum1,inunitcode1,innum2,inunitcode2,divisionA,outnum,outunitcode,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 lastmark=args"lastmark"

local tdivisionA,tdivisionB=argslastmark+tmark+1,argslastmark+tmark+2-- 讀取倒數最後一到兩位（對應 disp=x 時後兩位的位置）

if t_divsionB==nil then

t_divsionB=""

end

divisionA,divisionB=tdivisionA,tdivisionB

out={innum1,inunitcode1,innum2,inunitcode2,divisionA,outnum,outunitcode,divisionB}

return table.concat (out)

elseif disp=="filp" then--disp=filp

out={outnum,outunitcode,divisionA,innum1,inunitcode1,innum2,inunitcode2,divisionB}

return table.concat (out)

elseif disp=="unit" then--disp=unit

if in_num==1 then

outunitcode=Convert.linkbuilder (lkoutflag,groupname,outunit,Convert.displaybuilder (groupname,out_unit,false))

else

outunitcode=Convert.linkbuilder (lkoutflag,groupname,outunit,Convert.displaybuilder (groupname,out_unit,true))

end

out={innum1,inunitcode1,innum2,inunitcode2,divisionA,outnum,outunitcode,divisionB}

return table.concat (out)

elseif disp=="table" then--disp=table

local temp=""if args"sortable"~=nil then

-- 代替呼叫，效果等價

temp=string.format (%016.6f,in_num)

end

out={"|",temp,innum1,"，",innum2,"

",out_num}

return table.concat (out)

else

out={innum1,inunitcode1,innum2,inunitcode2,divisionA,outnum,outunitcode,divisionB}

return table.concat (out)

end

end

--

處理組合輸出 1 個處理單元

--

function Convert.bind1outtogether (args)

-- 鎖定錨點

local mark=args"mark"

-- 初始化數值，單位，轉換方法

local innum,outnum=tonumber (argsmark-1),

local inunit,outunit,group_name=argsmark,args"outputtogether",args"group"

local function_convert=

for k,v in pairs (out_unit) do

functionconvertk=Convert.convertbuilder (groupname,inunit,v)

end

-- 換算中

for k,v in pairs (function_convert) do

outnumk=v (innum)

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 functionsigfig=Convert.sigfigfunc

if args"disp"=="5" then

functionsigfig=Convert.sigfig5func

end

for k,v in pairs (out_unit) do

outnumk=functionsigfig (out_numk,sigfig)

end

-- 輸出

-- 輸出準備

local out

-- 讀取 lk，abbr，disp

local lk,abbr,disp=args"lk",args"abbr",args"disp"

local lkinflag,lkoutflag,abbrinflag,abbroutflag

local numberonlyflag,outnumberonlyflag,outunitonlyflag=false,false,false

--

lk 判斷

--

if lk=="off" then

lkinflag,lkoutflag=false,false

elseif lk=="in" then

lkinflag,lkoutflag=true,false

elseif lk=="out" then

lkinflag,lkoutflag=false,true

elseif lk=="on" then

lkinflag,lkoutflag=true,true

end

--

abbr 判斷

--

if abbr=="off" then

abbrinflag,abbroutflag=false,false

elseif abbr=="in" then

abbrinflag,abbroutflag=true,false

elseif abbr=="out" then

abbrinflag,abbroutflag=false,true

elseif abbr=="on" then

abbrinflag,abbroutflag=true,true

elseif abbr=="values" then

abbrinflag,abbroutflag=false,false

numberonlyflag=true

end

--

生成單位的輸出程式碼

--

local inunitcode=Convert.linkbuilder (lkinflag,groupname,inunit,Convert.displaybuilder (groupname,inunit,abbrin_flag))

inunitcode=(numberonlyflag and "") or inunitcode

local outunit_code=

for k,v in pairs (out_unit) do

outunitcodek=Convert.linkbuilder (

lkoutflag,

group_name,

v,

Convert.display_builder (

group_name,

v,

abbroutflag

)

)

end

if (not (disp=="output only") and numberonlyflag) then

			outunit_code=

		end

--

disp 判斷輸出

--

local divisionA,divisionB="（","）"

if disp=="output only" then

-- if numberonlyflag then

-- inunit_code=""

-- end

-- innum=""-- out={innum,inunitcode,divisionA,outnum1,outunitcode1,"，",outnum2,outunit_code2,divisionB}

out={outnum1,outunitcode1,"，",outnum2,outunitcode2}

return table.concat (out)

elseif disp=="output number only" then

-- inunitcode=""-- innum=""

-- outunit_code={"",""}

-- out={innum,inunitcode,divisionA,outnum1,outunitcode1,"，",outnum2,outunitcode2,divisionB}

out={outnum1"，",outnum2}

return table.concat (out)

elseif disp=="or" then--disp=or

divisionA,divisionB="或",""out={innum,inunitcode,divisionA,outnum1,outunitcode1,"，",outnum2,outunitcode2,divisionB}

return table.concat (out)

elseif disp=="b" then--disp=b，預設

divisionA,divisionB="（","）"

out={innum,inunitcode,divisionA,outnum1,outunitcode1,"，",outnum2,outunitcode2,divisionB}

return table.concat (out)

elseif disp=="comma" then--disp=comma

divisionA,divisionB="，",""out={innum,inunitcode,divisionA,outnum1,outunitcode1,"，",outnum2,outunitcode2,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 lastmark=args"lastmark"

local tdivisionA,tdivisionB=argslastmark+tmark+1,argslastmark+tmark+2-- 讀取倒數最後一到兩位（對應 disp=x 時後兩位的位置）

if t_divsionB==nil then

t_divsionB=""

end

divisionA,divisionB=tdivisionA,tdivisionB

out={innum,inunitcode,divisionA,outnum1,outunitcode1,"，",outnum2,outunitcode2,divisionB}

return table.concat (out)

elseif disp=="filp" then--disp=filp

out={outnum1,outunitcode1,"，",outnum2,outunitcode2,divisionA,innum,inunitcode,divisionB}

return table.concat (out)

elseif disp=="unit" then--disp=unit

if in_num==1 then

for k,v in pairs (out_unit) do

outunitcodek=Convert.linkbuilder (

lkoutflag,

group_name,

v,

Convert.display_builder (

group_name,

v,

false

)

)

end

else

for k,v in pairs (out_unit) do

outunitcodek=Convert.linkbuilder (

lkoutflag,

group_name,

v,

Convert.display_builder (

group_name,

v,

true

)

)

end

end

out={innum,inunitcode,divisionA,outnum1,outunitcode1,"，",outnum2,outunitcode2,divisionB}

return table.concat (out)

elseif disp=="table" then--disp=table

local temp=""if args"sortable"~=nil then

-- 代替呼叫，效果等價

temp=string.format (%016.6f,in_num)

end

out={"|",temp,innum,"",outnum1,"，",outunit_code2}

return table.concat (out)

else

out={innum,inunitcode,divisionA,outnum1,outunitcode1,"，",outnum2,outunitcode2,divisionB}

return table.concat (out)

end

end

--

處理普通 2 個處理單元

--

function Convert.bind_2 (args)

-- 鎖定錨點

local mark=args"mark"

-- 初始化數值，單位，轉換方法

local innum,outnum=,

local embellish=args"embellish"

local inunit,outunit,group_name=argsmark,argsmark+1,args"group"

local functionconvert=Convert.convertbuilder (groupname,inunit,out_unit)

-- 資料初始化

for i=1,mark,2 do

local key=#in_num+1

innumkey,outnumkey=argsi,0

end

-- 換算中

for k,v in pairs (in_num) do

outnumk=functionconvert (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 functionsigfig=Convert.sigfigfunc

if args"disp"=="5" then

functionsigfig=Convert.sigfig5func

end

for k,v in pairs (out_num) do

outnumk=functionsigfig (v,sigfig)

end

-- 輸出

-- 輸出準備

local out=

-- 讀取 lk，abbr，disp

local lk,abbr,disp=args"lk",args"abbr",args"disp"

local lkinflag,lkoutflag,abbrinflag,abbroutflag

local numberonlyflag,outnumberonlyflag,outunitonlyflag=false,false,false

--

lk 判斷

--

if lk=="off" then

lkinflag,lkoutflag=false,false

elseif lk=="in" then

lkinflag,lkoutflag=true,false

elseif lk=="out" then

lkinflag,lkoutflag=false,true

elseif lk=="on" then

lkinflag,lkoutflag=true,true

end

--

abbr 判斷

--

if abbr=="off" then

abbrinflag,abbroutflag=false,false

elseif abbr=="in" then

abbrinflag,abbroutflag=true,false

elseif abbr=="out" then

abbrinflag,abbroutflag=false,true

elseif abbr=="on" then

abbrinflag,abbroutflag=true,true

elseif abbr=="values" then

abbrinflag,abbroutflag=false,false

numberonlyflag=true

end

--

生成單位的輸出程式碼

--

local inunitcode=Convert.linkbuilder (lkinflag,groupname,inunit,Convert.displaybuilder (groupname,inunit,abbrin_flag))

inunitcode=(numberonlyflag and "") or inunitcode

local outunitcode=Convert.linkbuilder (lkoutflag,groupname,outunit,Convert.displaybuilder (groupname,outunit,abbrout_flag))

if (not (disp=="output only") and numberonlyflag) then

			outunit_code=""

		end

--

disp 判斷輸出

--

local divisionA,divisionB="（","）"

if disp=="output only" then

-- if numberonlyflag then

-- inunit_code=""

-- end

-- in_num=

-- for k,v in pairs (in_num) do

-- table.insert (out,v)

-- if k%016.6f,in_num1)

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,embellishk)

end

end

table.insert (out,"

")

for k,v in pairs (out_num) do

table.insert (out,v)

if k<#embellish then

table.insert (out,embellishk)

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,embellishk)

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,embellishk)

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