<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://telupedia.w.kmwc.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AConvertIB</id>
	<title>Module:ConvertIB - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://telupedia.w.kmwc.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AConvertIB"/>
	<link rel="alternate" type="text/html" href="https://telupedia.w.kmwc.org/index.php?title=Module:ConvertIB&amp;action=history"/>
	<updated>2026-04-06T04:57:44Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://telupedia.w.kmwc.org/index.php?title=Module:ConvertIB&amp;diff=3592&amp;oldid=prev</id>
		<title>Maxisnt: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://telupedia.w.kmwc.org/index.php?title=Module:ConvertIB&amp;diff=3592&amp;oldid=prev"/>
		<updated>2025-10-15T00:25:48Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 00:25, 15 October 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key telupedia:diff:1.41:old-3591:rev-3592 --&gt;
&lt;/table&gt;</summary>
		<author><name>Maxisnt</name></author>
	</entry>
	<entry>
		<id>https://telupedia.w.kmwc.org/index.php?title=Module:ConvertIB&amp;diff=3591&amp;oldid=prev</id>
		<title>Wikipedia&gt;Hike395: lop off junk at end of numeric arguments to density()</title>
		<link rel="alternate" type="text/html" href="https://telupedia.w.kmwc.org/index.php?title=Module:ConvertIB&amp;diff=3591&amp;oldid=prev"/>
		<updated>2025-10-04T04:35:37Z</updated>

		<summary type="html">&lt;p&gt;lop off junk at end of numeric arguments to density()&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require(&amp;#039;strict&amp;#039;)&lt;br /&gt;
local p = {}&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
&lt;br /&gt;
-- Function to pull out values and units from numeric args&lt;br /&gt;
-- Returns:&lt;br /&gt;
--   values:  list of numeric values, or &amp;quot;false&amp;quot; if no numeric argument is given&lt;br /&gt;
--   units: list of units (str)&lt;br /&gt;
--   value: if there is a last numeric value unpaired with a unit, it becomes the precision&lt;br /&gt;
--   anyValue: whether there is a non-false value in the values list&lt;br /&gt;
local function parseValuesUnits(args)&lt;br /&gt;
	local values = {}&lt;br /&gt;
	local units = {}&lt;br /&gt;
	local indx = 1&lt;br /&gt;
	local value = nil&lt;br /&gt;
	local anyValue = false&lt;br /&gt;
	-- loop through numeric arguments in pairs&lt;br /&gt;
	while args[indx] or args[indx+1] do&lt;br /&gt;
		value = args[indx]&lt;br /&gt;
		anyValue = anyValue or value&lt;br /&gt;
		-- if there is a unit, save in output lists&lt;br /&gt;
		if args[indx+1] then&lt;br /&gt;
			table.insert(values, value or false)&lt;br /&gt;
			table.insert(units, args[indx+1])&lt;br /&gt;
			value = nil&lt;br /&gt;
		end&lt;br /&gt;
		indx = indx+2&lt;br /&gt;
	end&lt;br /&gt;
	return values, units, value, anyValue&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Function to identify multiple units and rewrite them as new input or output groups&lt;br /&gt;
-- Args:&lt;br /&gt;
--   values, units: numeric values and units, as lists with same length&lt;br /&gt;
-- Returns:&lt;br /&gt;
--   newValues, newUnits: same lists rewritten&lt;br /&gt;
local function parseMultiples(values, units)&lt;br /&gt;
	local newValues = {}&lt;br /&gt;
	local newUnits = {}&lt;br /&gt;
	local i = 1&lt;br /&gt;
	-- we will search for multiples with up to 4 entries (depending on length)&lt;br /&gt;
	local maxMultiple = math.min(4,#units-1)&lt;br /&gt;
	local valueFound = false -- flag to suppress second (and later) input values&lt;br /&gt;
	--- Hack for handling &amp;quot;stone&amp;quot;: check if only value supplied is &amp;quot;lb&amp;quot;&lt;br /&gt;
	local onlyPounds = true&lt;br /&gt;
	for i = 1, #units do&lt;br /&gt;
		if values[i] and units[i] ~= &amp;#039;lb&amp;#039; then&lt;br /&gt;
			onlyPounds = false&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
    local multiple = mw.loadData(&amp;#039;Module:ConvertIB/data&amp;#039;).multiple&lt;br /&gt;
	-- sweep through units&lt;br /&gt;
	while i &amp;lt;= #units do&lt;br /&gt;
		-- determine index of last possible unit that could contain a multiple&lt;br /&gt;
		local last_unit = math.min(i+maxMultiple-1,#units)&lt;br /&gt;
		local multipleFound = false&lt;br /&gt;
		-- try from longest multiple down to double multiple (prefer longest ones)&lt;br /&gt;
		for j = last_unit, i+1, -1 do&lt;br /&gt;
			local key = table.concat({unpack(units,i,j)}, &amp;#039;&amp;#039;)&lt;br /&gt;
			if multiple[key] then&lt;br /&gt;
				-- we found a multiple unit&lt;br /&gt;
				multipleFound = true&lt;br /&gt;
				-- Hack for &amp;quot;stone&amp;quot;: add either &amp;#039;lb&amp;#039; or multiple unit string to output units&lt;br /&gt;
				--    depending on whether &amp;#039;lb&amp;#039; was the only unit string with a value&lt;br /&gt;
				if mw.ustring.sub(key,1,2) == &amp;#039;st&amp;#039; then&lt;br /&gt;
					table.insert(newValues, false)&lt;br /&gt;
					table.insert(newUnits, onlyPounds and key or &amp;#039;lb&amp;#039;)&lt;br /&gt;
				end&lt;br /&gt;
				-- if there are any value in the span of the multiple,&lt;br /&gt;
				-- then the multiple is an input&lt;br /&gt;
				-- assume all missing values after the first are zero&lt;br /&gt;
				local firstValueFound = false&lt;br /&gt;
				for k = i, j do&lt;br /&gt;
					firstValueFound = not valueFound and (firstValueFound or values[k])&lt;br /&gt;
					if firstValueFound then&lt;br /&gt;
						table.insert(newValues, values[k] or 0)&lt;br /&gt;
						table.insert(newUnits, units[k])&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				valueFound = valueFound or firstValueFound&lt;br /&gt;
				-- if no values in the span of the multiple,&lt;br /&gt;
				-- then the multiple is an output. Insert combined string as output unit&lt;br /&gt;
				if not firstValueFound then&lt;br /&gt;
					table.insert(newValues, false)&lt;br /&gt;
					table.insert(newUnits, key)&lt;br /&gt;
				end&lt;br /&gt;
				i = j+1&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		--- If no multiple unit was found, insert value[i] and unit[i] into rewritten lists&lt;br /&gt;
		if not multipleFound then&lt;br /&gt;
			if valueFound then&lt;br /&gt;
				table.insert(newValues, false) -- skip writing value if it is a duplicate&lt;br /&gt;
			else&lt;br /&gt;
				table.insert(newValues,values[i])&lt;br /&gt;
				valueFound = values[i]&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(newUnits, units[i])&lt;br /&gt;
			i = i+1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return newValues, newUnits			&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Call {{convert}} with args&lt;br /&gt;
local function callConvert(args)&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	return frame:expandTemplate{title=&amp;#039;Convert&amp;#039;, args=args}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Implement {{convinfobox}}&lt;br /&gt;
function p._convert(args)&lt;br /&gt;
	-- find all values and units in numeric args (and the precision, if it exists)&lt;br /&gt;
	local values, units, precision, anyValue = parseValuesUnits(args)&lt;br /&gt;
	-- bail if no values at all&lt;br /&gt;
	if not anyValue then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	-- rewrite values and units if multiple units are found&lt;br /&gt;
	values, units = parseMultiples(values, units)&lt;br /&gt;
	-- sort input and outputs into different buckets&lt;br /&gt;
	local input_values = {}&lt;br /&gt;
	local input_units = {}&lt;br /&gt;
	local output_units = {}&lt;br /&gt;
	for i = 1, #units do&lt;br /&gt;
		if values[i] then&lt;br /&gt;
			table.insert(input_values, values[i])&lt;br /&gt;
			table.insert(input_units, units[i])&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(output_units, units[i])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- bail if nothing to convert&lt;br /&gt;
	if #input_values == 0 or #output_units == 0 then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	-- assemble argument list to {{convert}}&lt;br /&gt;
	local innerArgs = {}&lt;br /&gt;
	-- First, pass all input unit(s)&lt;br /&gt;
	for i, v in ipairs(input_values) do&lt;br /&gt;
		table.insert(innerArgs,v)&lt;br /&gt;
		table.insert(innerArgs,input_units[i])&lt;br /&gt;
	end&lt;br /&gt;
	-- Then the output unit(s) [concatenated as single argument]&lt;br /&gt;
	table.insert(innerArgs,table.concat(output_units,&amp;quot;+&amp;quot;))&lt;br /&gt;
	if precision then&lt;br /&gt;
		table.insert(innerArgs,precision) -- last non-nil value contains precision&lt;br /&gt;
	end&lt;br /&gt;
	-- now handle all non-numeric arguments, passing to {{convert}}&lt;br /&gt;
	innerArgs.abbr = &amp;#039;on&amp;#039;  -- abbr=on by default&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		if not tonumber(k) then&lt;br /&gt;
			innerArgs[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
    return callConvert(innerArgs)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function impUnitPref(pref,country)&lt;br /&gt;
    --- lower case all arguments&lt;br /&gt;
    pref = pref and mw.ustring.lower(pref)&lt;br /&gt;
    country = country and mw.ustring.lower(country)&lt;br /&gt;
    --- determine imperial unit by going thru arguments in priority order&lt;br /&gt;
    if pref and pref ~= &amp;#039;dunam&amp;#039; then&lt;br /&gt;
        local impPref = mw.loadData(&amp;#039;Module:ConvertIB/data&amp;#039;).impPref&lt;br /&gt;
        return impPref[pref]&lt;br /&gt;
    elseif country then&lt;br /&gt;
        return mw.ustring.find(country,&amp;quot;united states&amp;quot;,1,true) &lt;br /&gt;
               or mw.ustring.find(country,&amp;quot;united kingdom&amp;quot;,1,true)&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local largeUnits = {km2=true,mi2=true,sqmi=true,km=true,mi=true}&lt;br /&gt;
&lt;br /&gt;
-- Implement {{Infobox settlement/areadisp}}&lt;br /&gt;
function p._area(args)&lt;br /&gt;
    local pref = args[&amp;#039;pref&amp;#039;]&lt;br /&gt;
    local country = args[&amp;#039;name&amp;#039;]&lt;br /&gt;
    local impus = impUnitPref(pref, country)&lt;br /&gt;
    local dunam = args[&amp;#039;dunam&amp;#039;] or args[&amp;#039;dunum&amp;#039;]&lt;br /&gt;
    local link = args[&amp;#039;link&amp;#039;]&lt;br /&gt;
    local innerArgs = {}&lt;br /&gt;
    innerArgs.abbr = &amp;#039;on&amp;#039;&lt;br /&gt;
    innerArgs.order = &amp;#039;out&amp;#039;&lt;br /&gt;
    for _, unit in ipairs({&amp;#039;km2&amp;#039;,&amp;#039;mi2&amp;#039;,&amp;#039;sqmi&amp;#039;,&amp;#039;ha&amp;#039;,&amp;#039;acre&amp;#039;}) do&lt;br /&gt;
        if args[unit] then&lt;br /&gt;
            table.insert(innerArgs,args[unit])&lt;br /&gt;
            table.insert(innerArgs,unit)&lt;br /&gt;
            if largeUnits[unit] then&lt;br /&gt;
                table.insert(innerArgs,impus and &amp;#039;sqmi km2&amp;#039; or &amp;#039;km2 sqmi&amp;#039;)&lt;br /&gt;
            else&lt;br /&gt;
                table.insert(innerArgs,impus and &amp;#039;acre ha&amp;#039; or &amp;#039;ha acre&amp;#039;)&lt;br /&gt;
            end&lt;br /&gt;
            return callConvert(innerArgs)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if dunam then&lt;br /&gt;
        table.insert(innerArgs,dunam)&lt;br /&gt;
        table.insert(innerArgs,&amp;#039;dunam&amp;#039;)&lt;br /&gt;
        pref = pref and mw.ustring.lower(pref)&lt;br /&gt;
        local order = pref == &amp;#039;dunam&amp;#039; and &amp;#039;dunam &amp;#039; or &amp;#039;&amp;#039;&lt;br /&gt;
        dunam = mw.getContentLanguage():parseFormattedNumber(dunam)&lt;br /&gt;
        if impus then&lt;br /&gt;
            order = order..(dunam and dunam &amp;lt; 2589 and &amp;#039;acre ha&amp;#039; or &amp;#039;sqmi km2&amp;#039;)&lt;br /&gt;
        else&lt;br /&gt;
            order = order..(dunam and dunam &amp;lt; 1000 and &amp;#039;ha acre&amp;#039; or &amp;#039;km2 sqmi&amp;#039;)&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(innerArgs,order)&lt;br /&gt;
        local yesNo = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
        if yesNo(link,true) and link ~= &amp;#039;none&amp;#039; then&lt;br /&gt;
            innerArgs.lk = &amp;#039;in&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
        return callConvert(innerArgs)&lt;br /&gt;
    end&lt;br /&gt;
    return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Implement {{Infobox settlement/lengthdisp}}&lt;br /&gt;
function p._length(args)&lt;br /&gt;
    local pref = args[&amp;#039;pref&amp;#039;]&lt;br /&gt;
    if pref == &amp;#039;dunam&amp;#039; then  -- ignore dunam pref for this function&lt;br /&gt;
        pref = nil&lt;br /&gt;
    end&lt;br /&gt;
    local country = args[&amp;#039;name&amp;#039;]&lt;br /&gt;
    local impus = impUnitPref(pref, country)&lt;br /&gt;
    local innerArgs = {}&lt;br /&gt;
    innerArgs.abbr = &amp;#039;on&amp;#039;&lt;br /&gt;
    innerArgs.order = &amp;#039;out&amp;#039;&lt;br /&gt;
    for _, unit in ipairs({&amp;#039;km&amp;#039;,&amp;#039;mi&amp;#039;,&amp;#039;m&amp;#039;,&amp;#039;ft&amp;#039;}) do&lt;br /&gt;
        if args[unit] then&lt;br /&gt;
            table.insert(innerArgs,args[unit])&lt;br /&gt;
            table.insert(innerArgs,unit)&lt;br /&gt;
            if largeUnits[unit] then&lt;br /&gt;
                table.insert(innerArgs,impus and &amp;#039;mi km&amp;#039; or &amp;#039;km mi&amp;#039;)&lt;br /&gt;
            else&lt;br /&gt;
                table.insert(innerArgs,impus and &amp;#039;ft m&amp;#039; or &amp;#039;m ft&amp;#039;)&lt;br /&gt;
            end&lt;br /&gt;
            return callConvert(innerArgs)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local lang&lt;br /&gt;
&lt;br /&gt;
local function parseNumeric(s)&lt;br /&gt;
    local num_str = string.match(tostring(s), &amp;#039;^[+-]?%d[%d,]*%.?%d*e?[+-]?%d*&amp;#039;)&lt;br /&gt;
    if not num_str then&lt;br /&gt;
       return nil&lt;br /&gt;
    end&lt;br /&gt;
    lang = lang or mw.getContentLanguage()&lt;br /&gt;
    return lang:parseFormattedNumber(num_str)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--Compute number of significant digits in a numeric string&lt;br /&gt;
local function computeSigFig(s)&lt;br /&gt;
    local num_str = string.match(tostring(s), &amp;#039;^[+-]?%d[%d,]*%.?%d*&amp;#039;)&lt;br /&gt;
    if not num_str then&lt;br /&gt;
       return 0&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Strip leading signs&lt;br /&gt;
    num_str = string.gsub(num_str, &amp;#039;^[+-]&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
    -- Strip commas&lt;br /&gt;
    num_str = string.gsub(num_str, &amp;#039;,&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
    -- Strip leading zeros&lt;br /&gt;
    num_str = string.gsub(num_str, &amp;#039;^0*&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    if num_str == &amp;#039;&amp;#039; then&lt;br /&gt;
        return 0&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- If there&amp;#039;s a decimal point, all trailing zeros are significant.&lt;br /&gt;
    if string.find(num_str, &amp;#039;%.&amp;#039;) then&lt;br /&gt;
        return #string.gsub(num_str, &amp;#039;%.&amp;#039;, &amp;#039;&amp;#039;) -- Count all digits after removing decimal&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- If no decimal point, trailing zeros are not significant.&lt;br /&gt;
    -- Count all digits up to the last non-zero one.&lt;br /&gt;
    num_str = string.gsub(num_str, &amp;#039;0+$&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
    &lt;br /&gt;
    return #num_str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Implement {{Infobox settlement/densdisp}}&lt;br /&gt;
-- Returns table:&lt;br /&gt;
--   density = computed value if no error&lt;br /&gt;
--   error = error string if error. &lt;br /&gt;
--      These are only errors detected in this code, {{convert}} does its own error handling&lt;br /&gt;
function p._density(args)&lt;br /&gt;
    local result = {}&lt;br /&gt;
    local pref = args[&amp;#039;pref&amp;#039;]&lt;br /&gt;
    if pref == &amp;#039;dunam&amp;#039; then  -- ignore dunam pref for this function&lt;br /&gt;
        pref = nil&lt;br /&gt;
    end&lt;br /&gt;
    local country = args[&amp;#039;name&amp;#039;]&lt;br /&gt;
    local per_km2 = args[&amp;#039;/km2&amp;#039;]&lt;br /&gt;
    local per_mi2 = args[&amp;#039;/mi2&amp;#039;] or args[&amp;#039;/sqmi&amp;#039;]&lt;br /&gt;
    local impus = impUnitPref(pref, country, per_km2, per_mi2)&lt;br /&gt;
    local per_km2_value = parseNumeric(per_km2)&lt;br /&gt;
    local per_mi2_value = parseNumeric(per_mi2)&lt;br /&gt;
    local innerArgs = {}&lt;br /&gt;
    innerArgs.abbr = &amp;#039;on&amp;#039;&lt;br /&gt;
    if per_km2_value or per_mi2_value then&lt;br /&gt;
        innerArgs.order = &amp;#039;out&amp;#039;&lt;br /&gt;
        if per_km2_value then&lt;br /&gt;
            table.insert(innerArgs,per_km2_value)&lt;br /&gt;
            table.insert(innerArgs,&amp;#039;/km2&amp;#039;)&lt;br /&gt;
        else&lt;br /&gt;
            table.insert(innerArgs,per_mi2_value)&lt;br /&gt;
            table.insert(innerArgs,&amp;#039;/sqmi&amp;#039;)&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(innerArgs,impus and &amp;#039;/sqmi /km2&amp;#039; or &amp;#039;/km2 /sqmi&amp;#039;)&lt;br /&gt;
        result.density = callConvert(innerArgs)&lt;br /&gt;
        return result&lt;br /&gt;
    end&lt;br /&gt;
    if per_km2 ~= &amp;#039;auto&amp;#039; and per_mi2 ~= &amp;#039;auto&amp;#039; then&lt;br /&gt;
        -- automatic computation not requested, fail silently&lt;br /&gt;
        return result&lt;br /&gt;
    end&lt;br /&gt;
    if not args[&amp;#039;pop&amp;#039;] then&lt;br /&gt;
        -- fail silently if no population given&lt;br /&gt;
        return result&lt;br /&gt;
    end&lt;br /&gt;
    local areaSigFig&lt;br /&gt;
    local areaValue&lt;br /&gt;
    local areaUnit&lt;br /&gt;
    for _, unit in ipairs({&amp;#039;km2&amp;#039;,&amp;#039;mi2&amp;#039;,&amp;#039;sqmi&amp;#039;,&amp;#039;ha&amp;#039;,&amp;#039;acre&amp;#039;,&amp;#039;dunam&amp;#039;,&amp;#039;dunum&amp;#039;}) do&lt;br /&gt;
        local value = parseNumeric(args[unit])&lt;br /&gt;
        if value then&lt;br /&gt;
            if value &amp;lt;= 0 then&lt;br /&gt;
                result.error = unit..&amp;quot; value not positive&amp;quot;&lt;br /&gt;
                return result&lt;br /&gt;
            end&lt;br /&gt;
            areaValue = value&lt;br /&gt;
            areaUnit = unit&lt;br /&gt;
            areaSigFig = computeSigFig(args[unit])&lt;br /&gt;
            break&lt;br /&gt;
        elseif args[unit] then&lt;br /&gt;
            result.error = &amp;quot;Malformed &amp;quot;..unit..&amp;quot; value&amp;quot;&lt;br /&gt;
            return result&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if not areaSigFig then&lt;br /&gt;
        -- fail silently if no area given&lt;br /&gt;
        return result&lt;br /&gt;
    end&lt;br /&gt;
    if areaSigFig == 0 then&lt;br /&gt;
        result.error = &amp;quot;Malformed area string&amp;quot;&lt;br /&gt;
        return result&lt;br /&gt;
    end&lt;br /&gt;
    local popValue = parseNumeric(args[&amp;#039;pop&amp;#039;])&lt;br /&gt;
    if not popValue then&lt;br /&gt;
        result.error = &amp;quot;Malformed population value&amp;quot;&lt;br /&gt;
        return result&lt;br /&gt;
    end&lt;br /&gt;
    if popValue &amp;lt; 0 then&lt;br /&gt;
        result.error = &amp;quot;Negative population value&amp;quot;&lt;br /&gt;
        return result&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(innerArgs,popValue/areaValue)&lt;br /&gt;
    table.insert(innerArgs,&amp;#039;/&amp;#039;..areaUnit)&lt;br /&gt;
    local popSigFig = computeSigFig(args[&amp;#039;pop&amp;#039;])&lt;br /&gt;
    local sigFig = popSigFig &amp;lt; areaSigFig and popSigFig or areaSigFig&lt;br /&gt;
    if sigFig &amp;lt; 2 then&lt;br /&gt;
        sigFig = 2&lt;br /&gt;
    end&lt;br /&gt;
    innerArgs.sigfig = sigFig&lt;br /&gt;
    innerArgs.disp = &amp;#039;out&amp;#039;&lt;br /&gt;
    table.insert(innerArgs,&amp;#039;/km2&amp;#039;)&lt;br /&gt;
    local metric = callConvert(innerArgs)&lt;br /&gt;
    innerArgs[3] = &amp;#039;/sqmi&amp;#039;&lt;br /&gt;
    local imperial = callConvert(innerArgs)&lt;br /&gt;
    if impus then&lt;br /&gt;
        result.density = string.format(&amp;quot;%s (%s)&amp;quot;,imperial,metric)&lt;br /&gt;
    else&lt;br /&gt;
        result.density = string.format(&amp;quot;%s (%s)&amp;quot;,metric,imperial)&lt;br /&gt;
    end&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.convert(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	return p._convert(args) or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.area(frame)&lt;br /&gt;
    local args = getArgs(frame)&lt;br /&gt;
    return p._area(args) or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.length(frame)&lt;br /&gt;
    local args = getArgs(frame)&lt;br /&gt;
    return p._length(args) or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.density(frame)&lt;br /&gt;
    local args = getArgs(frame)&lt;br /&gt;
    local result = p._density(args)&lt;br /&gt;
    if result.density then&lt;br /&gt;
        return result.density&lt;br /&gt;
    end&lt;br /&gt;
    if result.error then&lt;br /&gt;
        local warning = require(&amp;#039;Module:If_preview&amp;#039;)._warning&lt;br /&gt;
        local result = warning({result.error})&lt;br /&gt;
        if mw.title.getCurrentTitle().namespace == 0 then&lt;br /&gt;
            result = result..&amp;#039;[[Category:Pages using infobox settlement with bad density arguments]]&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
        return result&lt;br /&gt;
    end&lt;br /&gt;
    return &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Wikipedia&gt;Hike395</name></author>
	</entry>
</feed>