Module:Conversion
Modèle de mise en forme de valeur numérique éventuellement accompagnée d'une unité de mesure.
Utilisation
modifierFonctions exportables vers un autre module
modifierfonction p.convertvalue(value, sourceunit, displayformat)
met en forme une valeur numérique éventuellement accompagné d'une unité de mesure
value
doit être un nombre, ou une chaîne pouvant être convertie en nombresourceunit
doit correspondre à une valeur acceptée sur Module:Conversion/Données.- la table
displayformat
contient les paramètres suivant :
showunit
showunit = true affiche l'unité de mesure, en utilisant l'abréviation donnée dans Module:Conversion/Données.showunit = long
utilise le format long ("mètres" à la place de "m").showlink =
affiche un lien vers l'article concernant l'unité de mesure (m -> m)rounding =
nombre de chiffres après la virgule
Fonctions exportables vers un modèle
modifierfonction p.display(frame)
: sert d'intermédiaire entre le wikicode et la fonction displayvalue. Arguments:
1 =
valeur numérique2 =
unité de mesure de la valeur d'origine3 =
unité de mesure de la valeur à retournershowunit =
mettre "true" pour afficher l'unité de mesurerounding =
nombre de chiffres après la virgule
Exemples
modifier{{#invoke:Conversion|display|25|foot|metre}}
7,62{{#invoke:Conversion|display|25|foot|metre|rounding=0|showunit = true}}
8 m
Modules externes et autres éléments dont ce module a besoin pour fonctionner
modifierlocal math_mod = require "Module:Math"
local formatnum = require "Module:Format".do_formatnum
local params = require "Module:Conversion/Données"
local defaultlang = 'fr'
local p = {}
local i18n = {
invalidunit = 'Page avec une unité de mesure non prise en charge'
}
local function numString(val, rounding, displayformat) -- transforme un nombre en chaîne
if rounding then
val = math_mod._round( val, rounding )
end
val = formatnum({tostring(val)})
if displayformat and displayformat.suffix then
val = val .. suffix
end
return val
end
local function convert(value, sourceunitdata, targetunitdata) -- convertir une valeur numérique en son équivalent dans une autre unité de mesure
if not value then
return nil
end
if type(value) ~= 'number' then
return error("bad datatype: " .. type(value))
end
if (not sourceunitdata) or (not targetunitdata) then
return value
end
return value * sourceunitdata[2] / targetunitdata[2]
end
function p.displayvalue(val, sourceunit, displayformat, errhandling) -- affiche une valeur formatée)
-- préparation des paramètres
local numval = tonumber(val)
if not numval then -- si les données sont inhabituelles, on laisse la fonction appelante se débrouiller
return val
end
if not displayformat or type(displayformat) ~= 'table' then
displayformat = {}
end
local showunit, showlink, rounding, targetunit = displayformat.showunit, displayformat.showlink, displayformat.rounding, displayformat.targetunit
-- récupération des donnnées concernant les unités
if sourceunit and not targetunit then
targetunit = sourceunit
end
local sourceunitdata, targetunitdata = sourceunit, targetunit
if type(sourceunitdata) ~= 'table' then
sourceunitdata = params.units[sourceunit] or params.units[params.redirects[sourceunit]]
end
if type(targetunitdata) ~= 'table' then
targetunitdata = params.units[targetunit] or params.units[params.redirects[targetunit]]
end
if sourceunitdata and targetunitdata and (targetunitdata[1] ~= sourceunitdata[1]) then
return error("measurement unit mismatch: " .. sourceunitdata[1] .. ' and ' .. targetunitdata[1] )
end
-- partie numérique
if (sourceunit and targetunit) and (sourceunit ~= targetunit) then
numval = convert(numval, sourceunitdata, targetunitdata)
end
local numstr = numString(numval, rounding)
-- affichage de l'unité
local unitstr, link
if not targetunitdata then -- pour éviter les bugs
targetunitdata = {}
end
if showunit == 'long' then -- format long = montrer l'unité en entier
if (numval or 0) > 1 then
unitstr = targetunitdata[7]
else
unitstr = targetunitdata[6]
end
elseif showunit then
unitstr = targetunitdata[3]
end
if sourceunit and showunit and (not unitstr) then
numstr = numstr .. '[[Category:' .. i18n.invalidunit .. ']]'
end
-- showlink
if type( displayformat.showlink == 'string') then --liens personnalisés
link = displayformat.showlink
elseif displayformat.showlink == true then -- liens vers l'article dédié
link = targetunitdata[5]
end
if unitstr and link then
unitstr = '[[' .. link .. '|' .. unitstr .. ']]'
end
return numstr .. ' ' .. (unitstr or '')
end
function p.display(frame)
local args = frame.args
local value, origunit, targetunit = args[1], args[2], args[3]
local rounding = args.rounding
local showlink, showunit = args.showlink, args.showunit
if showunit == 'true' then
showunit = true
end
if showlink == 'true' then
showlink = true
end
displayformat = {showunit = showunit, showlink = showlink, rounding = rounding, targetunit = targetunit}
return p.displayvalue(value, origunit, displayformat)
end
return p