<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://rishon.rcorp.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://rishon.rcorp.fr/index.php?action=history&amp;feed=atom&amp;title=Module%3AChiffres_romains"/>
	<link rel="alternate" type="text/html" href="https://rishon.rcorp.fr/index.php?title=Module:Chiffres_romains&amp;action=history"/>
	<updated>2026-09-06T06:48:54Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://rishon.rcorp.fr/index.php?title=Module:Chiffres_romains&amp;diff=427&amp;oldid=prev</id>
		<title>RubnK : 1 version importée</title>
		<link rel="alternate" type="text/html" href="https://rishon.rcorp.fr/index.php?title=Module:Chiffres_romains&amp;diff=427&amp;oldid=prev"/>
		<updated>2025-06-26T12:20:33Z</updated>

		<summary type="html">&lt;p&gt;1 version importée&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;fr&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Version précédente&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version du 26 juin 2025 à 14:20&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;fr&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(Aucune différence)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>RubnK</name></author>
	</entry>
	<entry>
		<id>https://rishon.rcorp.fr/index.php?title=Module:Chiffres_romains&amp;diff=426&amp;oldid=prev</id>
		<title>wp&gt;Od1n : correction paramètre &quot;depart&quot; inutilisé dans la fonction p._unique()&amp;nbsp;; cette variable est uniquement utilisée pour mémoriser la valeur de départ pour pouvoir l&#039;afficher en cas d&#039;erreur&amp;nbsp;; refs 141381203</title>
		<link rel="alternate" type="text/html" href="https://rishon.rcorp.fr/index.php?title=Module:Chiffres_romains&amp;diff=426&amp;oldid=prev"/>
		<updated>2024-02-15T10:21:44Z</updated>

		<summary type="html">&lt;p&gt;correction paramètre &amp;quot;depart&amp;quot; inutilisé dans la fonction p._unique() ; cette variable est uniquement utilisée pour mémoriser la valeur de départ pour pouvoir l&amp;#039;afficher en cas d&amp;#039;erreur ; refs &lt;a href=&quot;/index.php/Sp%C3%A9cial:Diff/141381203&quot; title=&quot;Spécial:Diff/141381203&quot;&gt;141381203&lt;/a&gt;&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;
	[&amp;#039;I&amp;#039;]  = 1,&lt;br /&gt;
	[&amp;#039;IV&amp;#039;] = 4,&lt;br /&gt;
	[&amp;#039;V&amp;#039;]  = 5,&lt;br /&gt;
	[&amp;#039;IX&amp;#039;] = 9,&lt;br /&gt;
	[&amp;#039;X&amp;#039;]  = 10,&lt;br /&gt;
	[&amp;#039;XL&amp;#039;] = 40,&lt;br /&gt;
	[&amp;#039;L&amp;#039;]  = 50,&lt;br /&gt;
	[&amp;#039;XC&amp;#039;] = 90,&lt;br /&gt;
	[&amp;#039;C&amp;#039;]  = 100,&lt;br /&gt;
	[&amp;#039;CD&amp;#039;] = 400,&lt;br /&gt;
	[&amp;#039;D&amp;#039;]  = 500,&lt;br /&gt;
	[&amp;#039;CM&amp;#039;] = 900,&lt;br /&gt;
	[&amp;#039;M&amp;#039;]  = 1000,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Restitution de la valeur d&amp;#039;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&amp;#039;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 = &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	romains, nb = string.gsub(romains, chaine, &amp;#039;&amp;#039;)&lt;br /&gt;
	if nb &amp;gt; 1 then&lt;br /&gt;
		test = false&lt;br /&gt;
		message = &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;Nombre romain incorrect, répétition de séquence incohérente (&amp;#039;..nb..&amp;#039; &amp;#039;..chaine..&amp;#039;)&amp;lt;/span&amp;gt;&amp;#039;&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&amp;#039;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 = &amp;#039;&amp;#039;&lt;br /&gt;
	local resultat, valeur = 0, 0&lt;br /&gt;
	local rang = &amp;#039;&amp;#039;&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, &amp;#039;IX&amp;#039;) then&lt;br /&gt;
		test, message, resultat, romains = p._uniques(romains, &amp;#039;IX&amp;#039;)&lt;br /&gt;
		if not test then return test, message, resultat end&lt;br /&gt;
	else&lt;br /&gt;
		if string.match(romains, &amp;#039;IV&amp;#039;) then&lt;br /&gt;
			test, message, resultat, romains = p._uniques(romains, &amp;#039;IV&amp;#039;)&lt;br /&gt;
			if not test then return test, message, resultat end&lt;br /&gt;
			rangs_atteints[&amp;#039;V&amp;#039;] = 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, &amp;#039;XL&amp;#039;) then&lt;br /&gt;
		test, message, valeur, romains = p._uniques(romains, &amp;#039;XL&amp;#039;)&lt;br /&gt;
		if not test then return test, message, resultat end&lt;br /&gt;
		rangs_atteints[&amp;#039;L&amp;#039;] = true&lt;br /&gt;
	else&lt;br /&gt;
		if string.match(romains, &amp;#039;XC&amp;#039;) then&lt;br /&gt;
			test, message, valeur, romains = p._uniques(romains, &amp;#039;XC&amp;#039;)&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, &amp;#039;CD&amp;#039;) then&lt;br /&gt;
		test, message, valeur, romains = p._uniques(romains, &amp;#039;CD&amp;#039;)&lt;br /&gt;
		if not test then return test, message, resultat end&lt;br /&gt;
		rangs_atteints[&amp;#039;D&amp;#039;] = true&lt;br /&gt;
	else&lt;br /&gt;
		if string.match(romains, &amp;#039;CM&amp;#039;) then&lt;br /&gt;
			test, message, valeur, romains = p._uniques(romains, &amp;#039;CM&amp;#039;)&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&amp;#039;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&amp;#039;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 ~= &amp;#039;&amp;#039; 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;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;Chiffre romain incorrect (&amp;#039;..rang..&amp;#039;)&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
		if ((valeur &amp;gt; 4) and not (rang == &amp;#039;M&amp;#039;))&lt;br /&gt;
		or rangs_atteints[rang]&lt;br /&gt;
		or (((rang == &amp;#039;V&amp;#039;) or (rang == &amp;#039;L&amp;#039;) or (rang == &amp;#039;D&amp;#039;)) and (valeur &amp;gt; 1)) then&lt;br /&gt;
			test = false&lt;br /&gt;
			message = &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;Nombre romain incorrect, répétition de chiffre (&amp;#039;..rang..&amp;#039;)&amp;lt;/span&amp;gt;&amp;#039;&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;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;Nombre romain incorrect, séquence incohérente (&amp;#039;..depart..&amp;#039;)&amp;lt;/span&amp;gt;&amp;#039;&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&amp;#039;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;#039;&amp;lt;abbr class=&amp;quot;abbr&amp;quot; title=&amp;quot;&amp;#039; .. nombre .. &amp;#039;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;romain&amp;quot; style=&amp;quot;text-transform:uppercase&amp;quot;&amp;gt;&amp;#039; .. romains .. &amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/abbr&amp;gt;&amp;#039;&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 = &amp;#039; &amp;#039; .. chaine .. &amp;#039; &amp;#039;&lt;br /&gt;
&lt;br /&gt;
	local offsetStart, offsetEnd, capture = mw.ustring.find(haystack, &amp;#039;%W(&amp;#039; .. typeromains .. &amp;#039;)%W&amp;#039;)&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 == &amp;#039;&amp;#039; then&lt;br /&gt;
		return &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;Aucun paramètre&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return &amp;#039;&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;&amp;#039; .. p._chaine(chaine) .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&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(&amp;#039;^%-?&amp;#039; .. typearabes .. &amp;#039;$&amp;#039;) 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>wp&gt;Od1n</name></author>
	</entry>
</feed>