<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wicri-demo.istex.fr/Wicri/Europe/fr/index.php?action=history&amp;feed=atom&amp;title=Module%3AChiffres_romains</id>
	<title>Module:Chiffres romains - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://wicri-demo.istex.fr/Wicri/Europe/fr/index.php?action=history&amp;feed=atom&amp;title=Module%3AChiffres_romains"/>
	<link rel="alternate" type="text/html" href="https://wicri-demo.istex.fr/Wicri/Europe/fr/index.php?title=Module:Chiffres_romains&amp;action=history"/>
	<updated>2026-04-19T13:10:01Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.31.10</generator>
	<entry>
		<id>https://wicri-demo.istex.fr/Wicri/Europe/fr/index.php?title=Module:Chiffres_romains&amp;diff=8436&amp;oldid=prev</id>
		<title>Jacques Ducloy : Page créée avec « -- luacheck: globals mw, no max line length  local p = {} local typeromains = &quot;[IVXLCDM]+&quot; local typearabes = &quot;[0-9]+&quot; local niveau_par_chiffre = { 	['I']  = 1, 	['IV'] =... »</title>
		<link rel="alternate" type="text/html" href="https://wicri-demo.istex.fr/Wicri/Europe/fr/index.php?title=Module:Chiffres_romains&amp;diff=8436&amp;oldid=prev"/>
		<updated>2024-06-08T13:00:14Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « -- luacheck: globals mw, no max line length  local p = {} local typeromains = &amp;quot;[IVXLCDM]+&amp;quot; local typearabes = &amp;quot;[0-9]+&amp;quot; local niveau_par_chiffre = { 	[&amp;#039;I&amp;#039;]  = 1, 	[&amp;#039;IV&amp;#039;] =... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- luacheck: globals mw, no max line length&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
local typeromains = &amp;quot;[IVXLCDM]+&amp;quot;&lt;br /&gt;
local typearabes = &amp;quot;[0-9]+&amp;quot;&lt;br /&gt;
local niveau_par_chiffre = {&lt;br /&gt;
	['I']  = 1,&lt;br /&gt;
	['IV'] = 4,&lt;br /&gt;
	['V']  = 5,&lt;br /&gt;
	['IX'] = 9,&lt;br /&gt;
	['X']  = 10,&lt;br /&gt;
	['XL'] = 40,&lt;br /&gt;
	['L']  = 50,&lt;br /&gt;
	['XC'] = 90,&lt;br /&gt;
	['C']  = 100,&lt;br /&gt;
	['CD'] = 400,&lt;br /&gt;
	['D']  = 500,&lt;br /&gt;
	['CM'] = 900,&lt;br /&gt;
	['M']  = 1000,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Restitution de la valeur d'une suite de chiffres romains identiques : XXX..., III..&lt;br /&gt;
-- On récupère la chaîne de départ tronquée de la séquence traitée, le chiffre romain composant cette séquence et le nombre d'occurrences&lt;br /&gt;
function p._niveau(romains)&lt;br /&gt;
	local longueur_chaine = string.len(romains)&lt;br /&gt;
	local valeur = 0&lt;br /&gt;
	local rang = string.sub(romains, 1, 1)&lt;br /&gt;
	local caractere = rang&lt;br /&gt;
	while (valeur &amp;lt; longueur_chaine) and (caractere == rang) do&lt;br /&gt;
		valeur = valeur + 1&lt;br /&gt;
		romains = string.sub(romains, 2)&lt;br /&gt;
		caractere = string.sub(romains, 1, 1)&lt;br /&gt;
	end&lt;br /&gt;
	return romains, rang, valeur&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Fonction destinée à gérer les séquences particulières (IV, IX, XL, XC, CD, CM), avec test de cohérence&lt;br /&gt;
function p._uniques(romains, chaine)&lt;br /&gt;
	local nb = 0&lt;br /&gt;
	local resultat = 0&lt;br /&gt;
	local test = true&lt;br /&gt;
	local message = ''&lt;br /&gt;
&lt;br /&gt;
	romains, nb = string.gsub(romains, chaine, '')&lt;br /&gt;
	if nb &amp;gt; 1 then&lt;br /&gt;
		test = false&lt;br /&gt;
		message = '&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;Nombre romain incorrect, répétition de séquence incohérente ('..nb..' '..chaine..')&amp;lt;/span&amp;gt;'&lt;br /&gt;
	else&lt;br /&gt;
		if nb == 1 then&lt;br /&gt;
			resultat = niveau_par_chiffre[chaine]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return test, message, resultat, romains&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Conversion d'un nombre romain et entier du système décimal, avec tests de cohérence&lt;br /&gt;
-- (fonction aussi utilisée dans [[Module:Nom dynastique]])&lt;br /&gt;
function p.conversion(romains)&lt;br /&gt;
	local rangs_atteints = {}&lt;br /&gt;
	for k, _ in pairs(niveau_par_chiffre) do&lt;br /&gt;
		rangs_atteints[k] = false&lt;br /&gt;
	end&lt;br /&gt;
	local test = true&lt;br /&gt;
	local message = ''&lt;br /&gt;
	local resultat, valeur = 0, 0&lt;br /&gt;
	local rang = ''&lt;br /&gt;
	local depart = romains&lt;br /&gt;
	local niveau = 10000&lt;br /&gt;
-- Cas des valeurs obtenues par soustraction du chiffre placé à gauche du chiffre significatif, séquences qui doivent être uniques&lt;br /&gt;
-- A/  Unités : IV et IX&lt;br /&gt;
	if string.match(romains, 'IX') then&lt;br /&gt;
		test, message, resultat, romains = p._uniques(romains, 'IX')&lt;br /&gt;
		if not test then return test, message, resultat end&lt;br /&gt;
	else&lt;br /&gt;
		if string.match(romains, 'IV') then&lt;br /&gt;
			test, message, resultat, romains = p._uniques(romains, 'IV')&lt;br /&gt;
			if not test then return test, message, resultat end&lt;br /&gt;
			rangs_atteints['V'] = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
-- B  Dizaines : XL et XC&lt;br /&gt;
	if string.match(romains, 'XL') then&lt;br /&gt;
		test, message, valeur, romains = p._uniques(romains, 'XL')&lt;br /&gt;
		if not test then return test, message, resultat end&lt;br /&gt;
		rangs_atteints['L'] = true&lt;br /&gt;
	else&lt;br /&gt;
		if string.match(romains, 'XC') then&lt;br /&gt;
			test, message, valeur, romains = p._uniques(romains, 'XC')&lt;br /&gt;
			if not test then return test, message, resultat end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	resultat = resultat + valeur&lt;br /&gt;
&lt;br /&gt;
-- C/  centaines : CD et CM&lt;br /&gt;
	valeur = 0&lt;br /&gt;
	if string.match(romains, 'CD') then&lt;br /&gt;
		test, message, valeur, romains = p._uniques(romains, 'CD')&lt;br /&gt;
		if not test then return test, message, resultat end&lt;br /&gt;
		rangs_atteints['D'] = true&lt;br /&gt;
	else&lt;br /&gt;
		if string.match(romains, 'CM') then&lt;br /&gt;
			test, message, valeur, romains = p._uniques(romains, 'CM')&lt;br /&gt;
			if not test then return test, message, resultat end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	resultat = resultat + valeur&lt;br /&gt;
&lt;br /&gt;
-- Une fois les cas particuliers traités, la chaine ne contient plus que des &amp;quot;séquences&amp;quot; de chiffres identiques&lt;br /&gt;
-- Ces séquences sont limitées à 4 occurrences (écriture simplifiée), sauf pour les milliers&lt;br /&gt;
-- Contrôle de l'unicité de présence des chiffres V, L et D&lt;br /&gt;
-- Contrôle de cohérence (on ne peut pas avoir une séquence du chiffre n si une séquence de chiffres d'un niveau inférieur à n a déjà été traitée)&lt;br /&gt;
	valeur = 0&lt;br /&gt;
	test = true&lt;br /&gt;
&lt;br /&gt;
	while romains ~= '' do&lt;br /&gt;
		romains, rang, valeur = p._niveau(romains)&lt;br /&gt;
		if not string.match(rang, typeromains) then&lt;br /&gt;
			test = false&lt;br /&gt;
			message = '&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;Chiffre romain incorrect ('..rang..')&amp;lt;/span&amp;gt;'&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
		if ((valeur &amp;gt; 4) and not (rang == 'M'))&lt;br /&gt;
		or rangs_atteints[rang]&lt;br /&gt;
		or (((rang == 'V') or (rang == 'L') or (rang == 'D')) and (valeur &amp;gt; 1)) then&lt;br /&gt;
			test = false&lt;br /&gt;
			message = '&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;Nombre romain incorrect, répétition de chiffre ('..rang..')&amp;lt;/span&amp;gt;'&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
		if niveau_par_chiffre[rang] &amp;gt; niveau then&lt;br /&gt;
			test = false&lt;br /&gt;
			message = '&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;Nombre romain incorrect, séquence incohérente ('..depart..')&amp;lt;/span&amp;gt;'&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
		rangs_atteints[rang] = true&lt;br /&gt;
		niveau = niveau_par_chiffre[rang]&lt;br /&gt;
		resultat = resultat + valeur*niveau&lt;br /&gt;
	end&lt;br /&gt;
	return test, message, resultat&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- À partir d'un nombre romain, fournit une chaine de caractères composée de ce nombre avec une infobulle donnant sa valeur en chiffres arabes&lt;br /&gt;
function p._RomainsInfobulle(romains)&lt;br /&gt;
	local test, message, nombre = p.conversion(romains)&lt;br /&gt;
&lt;br /&gt;
	if not test then&lt;br /&gt;
		return message&lt;br /&gt;
	else&lt;br /&gt;
		return '&amp;lt;abbr class=&amp;quot;abbr&amp;quot; title=&amp;quot;' .. nombre .. '&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;romain&amp;quot; style=&amp;quot;text-transform:uppercase&amp;quot;&amp;gt;' .. romains .. '&amp;lt;/span&amp;gt;&amp;lt;/abbr&amp;gt;'&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Décompose la chaîne transmise en nom/chiffres romains/complément&lt;br /&gt;
function p._chaine(chaine)&lt;br /&gt;
	local haystack = ' ' .. chaine .. ' '&lt;br /&gt;
&lt;br /&gt;
	local offsetStart, offsetEnd, capture = mw.ustring.find(haystack, '%W(' .. typeromains .. ')%W')&lt;br /&gt;
&lt;br /&gt;
	if offsetStart then&lt;br /&gt;
		return mw.ustring.sub(haystack, 2, offsetStart) .. p._RomainsInfobulle(capture) .. mw.ustring.sub(haystack, offsetEnd, -2)&lt;br /&gt;
	else&lt;br /&gt;
		return chaine&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Fonction utilisée par le modèle {{nobr romains}}&lt;br /&gt;
function p.NobrRomains(frame)&lt;br /&gt;
	local chaine = frame.args[1]&lt;br /&gt;
&lt;br /&gt;
	-- Si le paramètre passé est vide, retour&lt;br /&gt;
	if chaine == '' then&lt;br /&gt;
		return '&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;Aucun paramètre&amp;lt;/span&amp;gt;'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return '&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;' .. p._chaine(chaine) .. '&amp;lt;/span&amp;gt;'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Convertit le nombre passé en paramètre en chiffres romains&lt;br /&gt;
function p._ChiffresRomains(chiffre)&lt;br /&gt;
	local u = { &amp;quot;&amp;quot;, &amp;quot;I&amp;quot;, &amp;quot;II&amp;quot;, &amp;quot;III&amp;quot;, &amp;quot;IV&amp;quot;, &amp;quot;V&amp;quot;, &amp;quot;VI&amp;quot;, &amp;quot;VII&amp;quot;, &amp;quot;VIII&amp;quot;, &amp;quot;IX&amp;quot; }&lt;br /&gt;
	local d = { &amp;quot;&amp;quot;, &amp;quot;X&amp;quot;, &amp;quot;XX&amp;quot;, &amp;quot;XXX&amp;quot;, &amp;quot;XL&amp;quot;, &amp;quot;L&amp;quot;, &amp;quot;LX&amp;quot;, &amp;quot;LXX&amp;quot;, &amp;quot;LXXX&amp;quot;, &amp;quot;XC&amp;quot; }&lt;br /&gt;
	local c = { &amp;quot;&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;CC&amp;quot;, &amp;quot;CCC&amp;quot;, &amp;quot;CD&amp;quot;, &amp;quot;D&amp;quot;, &amp;quot;DC&amp;quot;, &amp;quot;DCC&amp;quot;, &amp;quot;DCCC&amp;quot;, &amp;quot;CM&amp;quot; }&lt;br /&gt;
	local m = { &amp;quot;&amp;quot;, &amp;quot;M&amp;quot;, &amp;quot;MM&amp;quot;, &amp;quot;MMM&amp;quot;, &amp;quot;MMMM&amp;quot; }&lt;br /&gt;
	local ret = &amp;quot;&amp;quot;&lt;br /&gt;
	if (chiffre &amp;lt; 0) then&lt;br /&gt;
		ret = &amp;quot;-&amp;quot;&lt;br /&gt;
		chiffre = -chiffre&lt;br /&gt;
	end&lt;br /&gt;
	if (chiffre &amp;gt;= 5000) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if (chiffre &amp;gt;= 1000) then&lt;br /&gt;
		local mil = math.floor(chiffre / 1000)&lt;br /&gt;
		ret = ret .. m[mil + 1]&lt;br /&gt;
		chiffre = chiffre % 1000&lt;br /&gt;
	end&lt;br /&gt;
	if (chiffre &amp;gt;= 100) then&lt;br /&gt;
		local cen = math.floor (chiffre / 100)&lt;br /&gt;
		ret = ret .. c[cen + 1]&lt;br /&gt;
		chiffre = chiffre % 100&lt;br /&gt;
	end&lt;br /&gt;
	if (chiffre &amp;gt;= 10) then&lt;br /&gt;
		local diz = math.floor (chiffre / 10)&lt;br /&gt;
		ret = ret .. d[diz + 1]&lt;br /&gt;
		chiffre = chiffre % 10&lt;br /&gt;
	end&lt;br /&gt;
	return ret .. u[chiffre + 1]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- notes :&lt;br /&gt;
-- * cette fonction est actuellement inutilisée&lt;br /&gt;
-- * il existe un modèle au rôle similaire : [[Modèle:Nombre en romain]]&lt;br /&gt;
function p.ChiffresRomains(frame)&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	if args[1] then&lt;br /&gt;
		if args[1]:match('^%-?' .. typearabes .. '$') then&lt;br /&gt;
			return p._ChiffresRomains(tonumber(args[1]))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Jacques Ducloy</name></author>
		
	</entry>
</feed>