Jump to content

Module:Measure

Википедиа — Чөлөөт нэвтэрхий толь
  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) .. "&nbsp;&#177;&nbsp;" .. tostring(tArgs.eps) .. ")"
			else
				Text = tArgs.data .. "&nbsp;&#177;&nbsp;" .. tostring(tArgs.eps)
			end
		else
			Text = tArgs.data
		end
		Text = Text .. "&nbsp;" .. 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