请输入您要查询的百科知识:

 

词条 Module:Formatnum
释义 -- This module is intended to replace the functionality of Template:Formatnum and related templates.

local p = {}

function p.main(frame)

    local args = frame:getParent().args    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 ''    -- validate the language parameter within MediaWiki's caller frame    if lang == "arabic-indic" then -- only for back-compatibility ("arabic-indic" is not a SupportedLanguage)        lang = "fa" -- better support than "ks"    elseif lang == '' or not mw.language.isSupportedLanguage(lang) then        -- Note that 'SupportedLanguages' are not necessarily 'BuiltinValidCodes', and so they are not necessarily        -- 'KnownLanguages' (with a language name defined at least in the default localisation of the local wiki).        -- But they all are ValidLanguageCodes (suitable as Wiki subpages or identifiers: no slash, colon, HTML tags, or entities)        -- In addition, they do not contain any capital letter in order to be unique in page titles (restriction inexistant in BCP47),        -- but they may violate the standard format of BCP47 language tags for specific needs in MediaWiki.        -- Empty/unspecified and unsupported languages are treated here in Commons using the user's language,        -- instead of the local 'ContentLanguage' of the Wiki.        lang = frame:callParserFunction( "int", "lang" ) -- get user's chosen language    end    return p.formatNum(number, lang, prec, sep ~= '')

end

local digit = { -- substitution of decimal digits for languages not supported by mw.language:formatNum() in core Lua libraries for MediaWiki

    ["ml-old"] = { '൦', '൧', '൨', '൩', '൪', '൫', '൬', '൭', '൮', '൯' },    ["mn"]     = { '᠐', '᠑', '᠒', '᠓', '᠔', '᠕', '᠖', '᠗', '᠘', '᠙'},    ["ta"]     = { '௦', '௧', '௨', '௩', '௪', '௫', '௬', '௭', '௮', '௯'},    ["te"]     = { '౦', '౧', '౨', '౩', '౪', '౫', '౬', '౭', '౮', '౯'},    ["th"]     = { '๐', '๑', '๒', '๓', '๔', '๕', '๖', '๗', '๘', '๙'}

}

function p.formatNum(number, lang, prec, compact)

    -- Do not alter the specified value when it is not a valid number, return it as is    local value = tonumber(number)    if value == nil then        return number    end    -- Basic ASCII-only formatting (without paddings)    number = tostring(value)
    -- Check the presence of an exponent (incorrectly managed in mw.language:FormatNum() and even forgotten due to an internal bug, e.g. in Hindi)    local exponent    local pos = string.find(number, '[Ee]')    if pos ~= nil then        exponent = string.sub(number, pos + 1, string.len(number))        number = string.sub(number, 1, pos - 1)    else        exponent = ''    end
    -- Check the minimum precision requested    prec = tonumber(prec) -- nil if not specified as a true number    if prec ~= nil then        prec = math.floor(prec)        if prec < 0 then            prec = nil -- discard an incorrect precision (not a positive integer)        elseif prec > 14 then            prec = 14 -- maximum precision supported by tostring(number)        end    end
    -- Preprocess the minimum precision in the ASCII string    local dot    if (prec or 0) > 0 then        pos = string.find(number, '.', 1, true) -- plain search, no regexp        if pos ~= nil then            prec = pos + prec - string.len(number) -- effective number of trailing decimals to add or remove            dot = '' -- already present        else            dot = '.' -- must be added        end    else        dot = '' -- don't add dot        prec = 0 -- don't alter the precision    end
    if lang ~= nil and mw.language.isKnownLanguageTag(lang) == true then        -- Convert number to localized digits, decimal separator, and group separators        local language = mw.getLanguage(lang)        if compact then            number = language:formatNum(tonumber(number), { noCommafy = 'y' }) -- caveat: can load localized resources for up to 20 languages        else            number = language:formatNum(tonumber(number)) -- caveat: can load localized resources for up to 20 languages        end        -- Postprocessing the precision        if prec > 0 then            local zero = language:formatNum(0)            number = number .. dot .. mw.ustring.rep(zero, prec)        elseif prec < 0 then            -- TODO: rounding of last decimal; here only truncate decimals in excess            number = mw.ustring.sub(number, 1, mw.ustring.len(number) + prec)        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' .. language:formatNum(tonumber(exponent),{noCommafy=true})        end    else -- not localized, ASCII only        -- Postprocessing the precision        if prec > 0 then            number = number .. dot .. mw.string.rep('0', prec)        elseif prec < 0 then            -- TODO: rounding of last decimal; here only truncate decimals in excess            number = mw.string.sub(number, 1, mw.string.len(number) + prec)        end
        -- Append the base-10 exponent        if exponent ~= '' then            number = number .. 'E' .. exponent        end    end
    -- Special cases for substitution of ASCII digits (missing support in Lua core libraries for some languages)    if digit[lang] then        for i, v in ipairs(digit[lang]) do            number = mw.ustring.gsub(number, tostring(i - 1), v)        end    end

end

return p

随便看

 

开放百科全书收录14589846条英语、德语、日语等多语种百科知识,基本涵盖了大多数领域的百科知识,是一部内容自由、开放的电子版国际百科全书。

 

Copyright © 2023 OENC.NET All Rights Reserved
京ICP备2021023879号 更新时间:2024/9/21 3:18:00