Sari la conținut

Modul:Formatnum

De la Wikipedia, enciclopedia liberă
local p = {}
p._stripSeparators = require('Modul:Matematică')._stripSeparators

function p.stripSeparators(frame)
	local ret = p._stripSeparators(frame.args[1])
	if ret then return ret else return "" end
end

function p._beautify(lang, number)
	if lang:getCode() ~= "ro" then return number end
	number = mw.allToString(number)
	number = string.gsub(number, "E%+([0-9]+)", " × 10<sup>%1</sup>")
	number = string.gsub(number, "E([0-9]+)", " × 10<sup>%1</sup>")
	number = string.gsub(number, "E%-([0-9]+)", " × 10<sup>-%1</sup>")
	return number
end

function p._formatNum(number, lang, prec, compact)
	--mw.logObject(number, "number1")
	if lang ~= nil and mw.language.isKnownLanguageTag(lang) == true then 
		lang = mw.getLanguage(lang) 
	end
	if lang == nil or lang == {} or type(lang) == "string" then
		lang = mw.getContentLanguage()
	end
	local processed = p._stripSeparators(number)
	if processed == nil then return number end

    -- Check the presence of an exponent (incorrectly managed in mw.language:FormatNum() and even forgotten due to an internal bug, e.g. in Hindi)
    number = tostring(processed)
    local pos = string.find(number, '[Ee]')
    local exponent
    if pos ~= nil then
        exponent = string.sub(number, pos + 1, string.len(number))
        number = string.sub(number, 1, pos - 1)
    else
        exponent = ''
    end
	number = tonumber(number)
	--mw.logObject(number, "number2")

    -- TODO: do something with prec
    if compact then
        number = lang:formatNum(number, { noCommafy = 'y' }) -- caveat: can load localized resources for up to 20 languages
    else
        number = lang:formatNum(number) -- caveat: can load localized resources for up to 20 languages
    end

    -- Append the localized base-10 exponent without grouping separators (there's no reliable way to detect a localized leading symbol 'E')
    if exponent ~= '' then
        number = number .. 'E' .. tonumber(exponent)
    end
    
    return p._beautify(lang, number)
end

function p.formatNum(frame)
	local args = require("Modul:Arguments").getArgs(frame)
    local prec    = args.prec or ''
    local sep     = args.sep or ''
    local number  = args[1] or args.number or ''
    local lang    = args[2] or args.lang or ''
    return p._formatNum(number, lang, prec, sep ~= '')
end

return p