Aller au contenu

Module:Conversion

Cette page fait l’objet d’une mesure de semi-protection étendue.
Une page de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 24 mai 2015 à 16:41 et modifiée en dernier par Zolo (discuter | contributions). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.

 Documentation[voir] [modifier] [historique] [purger]

Modèle de mise en forme de valeur numérique éventuellement accompagnée d'une unité de mesure.

Utilisation

Fonctions exportables vers un autre module

  • fonction p.displayvalue(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 nombre
  • sourceunit doit correspondre à une valeur acceptée sur Module:Conversion/Données.
  • la table displayformat contient les paramètres suivant :
  • targetunit = l'unité vers laquelle convertir
  • 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

  • fonction p.display(frame) : sert d'intermédiaire entre le wikicode et la fonction displayvalue. Arguments:
  • 1 = valeur numérique
  • 2 = unité de mesure de la valeur d'origine
  • 3 = unité de mesure de la valeur à retourner
  • showunit = mettre "true" pour afficher l'unité de mesure
  • rounding = nombre de chiffres après la virgule

Exemples

  • {{#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

Voir aussi

local math_mod = require( "Module:Math" )
local p = {}
local referenceunits = {
	length = 'metre',
	area = 'squaremeter',
}

local units = {-- {grandeur mesurée, valeur par rapport à l'unité de référence, symbole, élément wikidata, lien, libellé singulier, libellé pluriel}
	-- le lien et le libellé singulier pourraient-être récupérés de l'élément wikidata, mais c'est beaucoup moins efficient
	foot = {'length', 0.3048, ' ft', 'Q3710', 'Pied (unité)', 'pied', 'pieds'},
	hectare = {'area', 10000, ' ha', 'Q35852', 'hectare', 'hectare', 'hectares'},
	metre = {'length', 1, ' m', 'Q11573', 'mètre', 'mètre', 'mètres'},
	kilometre = {'length', 1000, ' km', 'Q828224', 'kilomètre', 'kilomètre', 'kilomètres',},
	['square meter'] = {'area', 1, ' m<sup>2</sup>', 'Q25343', ' mètre carré', 'mètre carré', 'mètres carrés'},
	['square kilometer'] = {'area', 1000000, ' km<sup>2</sup>', 'Q712226', ' kilomètre carré', 'kilomètre carré', 'kilomètres carrés'}
}

function p.displayvalue(val, unit, displayformat, errhandling) -- affiche une valeur formatée)
	if not val then
		return nil
	end
	local valstr = tostring(val)
	if type(val) == 'string' then
		val = string.gsub(val, ",", "\.")
		val = tonubmer(val)
	end
	if not displayformat or type(displayformat) ~= 'table' then
		displayformat = {}
	end
	local showunit, showlink, rounding = displayformat.showunit, displayformat.showlink, displayformat.rounding
	local unitstr  -- l'unité de mesure, telle qu'elle doit être affichée
	local link -- le lien à utiliser
	local unitdata = units[unit]
	if rounding then
		val = tonumber(val)
		val = math_mod._round( val, rounding )
	end

	if showunit == 'long' then -- format long montrer l'unité en entier
		if (tonumber(val) or 0) > 1 then
			unitstr = unitdata[7]
		else
			unitstr = unitdata[6]		end
	elseif showunit then
		unitstr = unitdata[3]
	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 =  unitdata[5]
	end
	if unitstr and link then
		unitstr = '[[' .. link .. '|' .. unitstr .. ']]'
	end
	
	if unitstr then
		unitstr = ' ' .. unitstr
	end

	return val .. (unitstr or '') 
end

function p._convert(value, sourceunit, targetunit, displayformat) -- convertit une valeur dans une autre unité (ou garde la même) et la formate
	if not value then
		return nil
	end
	if type(value) == 'string' then
		value = tonumber(value)
	end
	if type(value) ~= 'number' then
		return error("bad datatype: " .. type(value))
	end
	local sourceunitdata = units[sourceunit]
	local targetunitdata = units[targetunit]
	if not sourceunit then
		return error("unknown source measurement unit: " .. (sourceunit or "none provided"))
	end
	if not targetunitdata then
		return error("unknown target measurement unit: " .. (targetunit or "none provided"))
	end
	if (targetunitdata[1] ~= sourceunitdata[1]) then
		return error("measurement unit mismatch: " .. l[1] .. ' and ' .. targetunitdata[1] )
	end
	local newvalue = value * sourceunitdata[2] / targetunitdata[2]

	return p.displayvalue(newvalue, targetunit, displayformat)
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}
	return p._convert(value, origunit, targetunit, displayformat)
end
return p