Chiffre romain (entre 1 et 9999 compris)

5/5 (3 avis)

Snippet vu 55 631 fois - Téléchargée 29 fois

Contenu du snippet

Le script se limite à une fonction qui convertit un nombre entier décimal en nombre composé exclusivement de chiffres romains... Tout est dans le titre...

Source / Exemple :


<?php

function entier_romain($entier)
{
    $entier = intval($entier);
    if($entier<1 || $entier>9999)return "";
    
    $rom[3][4];
    $rom[3] = array("M", "", "", "");
    $rom[2] = array("C", "CD", "D", "CM");
    $rom[1] = array("X", "XL", "L", "XC");
    $rom[0] = array("I", "IV", "V", "IX");

    $i = 1;
    $n = 0;
    $romain = "";
    
    for($n=0; $n<4; $n++)
    {
    $chiffre = intval(($entier % ($i*10))/$i);
    if($n<3)
    {
        if($chiffre<4)
        {
        while($chiffre>0)
        {
            $romain = $rom[$n][0].$romain;
            $chiffre--;
        }
        }
        elseif($chiffre==4)
        $romain = $rom[$n][1].$romain;
        elseif($chiffre<9)
        {
        while($chiffre>5)
        {
            $romain = $rom[$n][0].$romain;
            $chiffre--;
        }
        $romain = $rom[$n][2].$romain;
        }
        else
        $romain = $rom[$n][3].$romain;
    }
    else
    {
        while($chiffre>0)
        {
        $romain = $rom[$n][0].$romain;
        $chiffre--;
        }
    }
    $i = $i*10;
    }
    return $romain;
}

function romain_entier($romain)
{

  if(!est_romain($romain))return 0;

  $rom[2][7];
  $rom[0] = array("I", "V", "X", "L", "C", "D", "M");
  $rom[1] = array(  1,   5,  10,  50, 100, 500,1000);
  
  $nombre = 0;
  $precedent = 1000;
  
  for($i=0; $i<strlen($romain); $i++)
  {
    for($j=0; $j<7; $j++)
      if($romain[$i]==$rom[0][$j])break;
	$valeur = $rom[1][$j];
	if($valeur>$precedent)$nombre = $nombre - 2*($precedent);
	$nombre = $nombre + $valeur;
	$precedent = $valeur;
  }
  return $nombre;
}

function est_romain($romain)
{
  $rom = array("I", "V", "X", "L", "C", "D", "M");
  
  $precedent = 6;
  
  for($i=0; $i<strlen($romain); $i++)
  {
    for($j=0; $j<7; $j++)
      if($romain[$i]==$rom[$j])break;
	if($j==7) return 0;
	if($j>$precedent)
	  if($j&1==1)
	    if($j-$precedent!=1)return 0;
	  else
	    if($j-$precedent!=1 && $j-$precedent!=2)return 0;
	$precedent = $j;
  }
  return 1;
}

$x = 490;

echo entier_romain($x)."<br>";
echo romain_entier(entier_romain($x))."<br>";

echo "XD : ".est_romain("XD")."<br>";
echo "CDCX : ".est_romain("CDXC")."<br>";

?>

A voir également

Ajouter un commentaire Commentaires
cs_Dri
Messages postés
30
Date d'inscription
lundi 21 avril 2003
Statut
Membre
Dernière intervention
10 mars 2007

28 mai 2004 à 14:12
J'ai ajouté deux autres fonctions, une pour savoir si une chaine est un nombre romain et une autre qui prend en parametre un nombre romain et retourne un entier...

Dri
cs_Dri
Messages postés
30
Date d'inscription
lundi 21 avril 2003
Statut
Membre
Dernière intervention
10 mars 2007

27 mai 2004 à 14:36
Par décimal j'entend base 10 ^^
Parce que les types en php c'est en gros tous des chaines de caracteres... Donc les variables numériques... Qu'elles soient décimale binaire hexa etc... Ca reste toujours du texte... Donc je précise base 10... C'est vrai que c'est un peu con en se relisant...

Dri ^^
willinfeo
Messages postés
55
Date d'inscription
vendredi 25 juillet 2003
Statut
Membre
Dernière intervention
4 décembre 2005

26 mai 2004 à 11:47
C'est quoi un nombre entier décimal. C'est nouveau ?
Remarque, ca fait longtemps que je suis pas allé en cours de math.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.