Modul:Measure
Die Dokumentation für dieses Modul kann unter Modul:Measure/Doku erstellt werden
local NoError, FormatNum = pcall( require, "Module:FormatNum" ) if type( FormatNum ) == "table" then FormatNum = FormatNum.FormatNum() else return '<span class="error"></span>' end local Measure = {} Measure.Convert = function (tArgs) --[=[ enthält die Umrechnung Inhalt von tArgs: tArgs.data number Zu konvertierender Wert tArgs.unit string Vorgabeeinheit von data tArgs.unitL string etwaige, kleitere Einheit tArgs.unitU string etwaige, größere Einheit tArgs.factorL number Faktor unit/unitL, Null für keine Umrechnung tArgs.factorU number Faktor unitU/unit, Null für keine Umrechnung tArgs.borderL number Schwellwert zur kleineren Einheit tArgs.borderU number Schwellwert zur größeren Einheit tArgs.eps number Unsicherheit false für kein Wert tArgs.round number Nachkommastellen ]=] tResult = {} if type(tArgs.data) ~= 'number' or type(tArgs.borderL or 0) ~= 'number' or type(tArgs.factorL or 0) ~= 'number' or type(tArgs.borderU or 0) ~= 'number' or type(tArgs.factorU or 0) ~= 'number' or (tArgs.unit or "") =="" then return false, tResult; end local IsMinus = tArgs.data < 0; if IsMinus then tArgs.data = 0 - tArgs.data end tResult.data = tArgs.data tResult.unit = tArgs.unit if tonumber(tArgs.eps) then tResult.eps = tArgs.eps end if (tArgs.factorL or 0) ~= 0 then if tArgs.data < tArgs.borderL then tResult.data = tArgs.data * tArgs.factorL if type(tArgs.eps) == 'number' then tResult.eps = tArgs.eps * tArgs.factorL end tResult.unit = tArgs.unitL end end if (tArgs.factorU or 0) ~= 0 then if tArgs.data >= tArgs.borderU then tResult.data = tArgs.data / tArgs.factorU if type(tArgs.eps) == 'number' then tResult.eps = tArgs.eps / tArgs.factorU end tResult.unit = tArgs.unitU end end if IsMinus then tResult.data = 0 - tResult.data end if type(tArgs.round) == 'number' then tArgs.round = math.floor(tArgs.round); tResult.data = math.floor(tResult.data * 10^tArgs.round + 0.5)/10^tArgs.round ; end return true, tResult; end -- AutoConvert: Wie Convert, jedoch mit den Schwellwerten 1 und factorU Measure.AutoConvert = function (tArgs) local tResult = {} local IsOk = true; if type(tArgs.factorU or 0) ~= 'number' then return false, tResult; end tArgs.borderL = 1; -- andere Werte werden hier einfach überschrieben. tArgs.borderU = tArgs.factorU; -- andere Werte werden hier einfach überschrieben. IsOk, tResult = Measure.Convert(tArgs) return IsOk, tResult; end Measure.Format = function (tArgs,tPara) --[=[ enthält die Formatierung der Zeichenkette Inhalt von tArgs: tArgs.data string Wert tArgs.unit string Einheit tArgs.eps string Unsicherheit Inhalt von tPara: tPara.fmt string Zahlenformat: 'dewiki' oder 'ch' tPara.kl logical true -> '(10 ± 2) km', false -> '10 ± 2 km' ]=] local Text = "" if (tArgs.eps or "") ~= "" then if tPara.kl then Text = "(" .. tostring(tArgs.data) .. " ± " .. tostring(tArgs.eps) .. ")" else Text = tArgs.data .. " ± " .. tostring(tArgs.eps) end else Text = tArgs.data end Text = Text .. " " .. tArgs.unit; return Text end -- Run enthält die Gemeinsamkeiten der Funktionen p.Mass und p.Masz local function Run (frame,fmt) local Text = " " local tData = {} local IsOk = true local tbl = {} local Para = ""; if tonumber(frame.args[1]) then tbl.data = tonumber(frame.args[1]); else Para = "(".. (frame.args[1] or "") .. ")"; Para = frame:callParserFunction{ name = '#expr', args = Para } tbl.data = tonumber(Para) or ""; end tbl.unit = frame.args[2] or ""; tbl.borderL = tonumber(frame.args[3] or "") tbl.unitL = frame.args[4] or ""; tbl.factorL = tonumber(frame.args[5] or 0) tbl.borderU = tonumber(frame.args[6] or "") tbl.unitU = frame.args[7] or ""; tbl.factorU = tonumber(frame.args[8] or 0) tbl.eps = tonumber(frame.args.eps or "") tbl.round = tonumber(frame.args.round or "") if type(tbl.data) ~= 'number' then Text = tostring(frame.args[1] or "") .. '<span style="display:none">[[Vorlage:Maß/Wartung/Maßzahl nicht numerisch|dep1]]</span>'; return false, Text end -- Sonderregelungen km und km² if tbl.unit =="km" and tbl.unitL=="" then tbl.borderL = 1; tbl.unitL = "m"; tbl.factorL = 1000; if tbl.data <10000 then fmt="de"; end end if tbl.unit =="km²" and tbl.unitL=="" then tbl.borderL = 1; tbl.unitL = "ha"; tbl.factorL = 100; if tbl.data <10000 then fmt="de"; end end if tbl.unit =="" then tbl.borderL = 1; tbl.factorL = 0; end IsOk, tData = Measure.Convert(tbl) tData.data = frame:expandTemplate{title = 'FormatNum', args = {tData.data,fmt}} --tData.data = FormatNum.format(tData.data,fmt) if tonumber(tData.eps) then tData.eps = frame:expandTemplate{title = 'FormatNum', args = {tData.eps, fmt}} -- tData.eps = FormatNum.format(tData.eps,fmt) end local tPar = {} tPar.kl = (frame.args.kl or "") ~= "" tPar.fmt = fmt; if not IsOk then Text = '<span class="error">Unzulässige Werte bei Aufruf von Measure;</span>'; return false, Text end Text = Measure.Format(tData,tPar); return true, Text end -- Run local p = {} function p.Masz(frame) local FR = frame:getParent() local IsOk, Out = Run(FR,'dewiki') return Out end function p.Mass(frame) local FR = frame:getParent() local IsOk, Out = Run(FR,'ch') return Out end function p.Measure() return Measure end return p