| 01 | | | 02 | | | 03 | | | 04 | | | 05 | | | 06 | | | 07 | | | 08 | | | 09 | | | 10 | | | 11 | | | 12 | | | 13 | | | 14 | | | 15 | | | 16 | | | 17 | | | 18 | | | 19 | | | 20 | | | 21 | | | 22 | | | 23 | | | 24 | | | 25 | | | 26 | | | 27 | | | 28 | | | 29 | | | 30 | | | 31 | | | 32 | | | 33 | | | 34 | | | 35 | | | 36 | | | 37 | | | 38 | | | 39 | | | 40 | | | 41 | | | 42 | | | 43 | | | 44 | | | 45 | | | 46 | | | 47 | | | 48 | | | 49 | | | 50 | | | 51 | | | 52 | | | 53 | | | 54 | | | 55 | | | 56 | | | 57 | | | 58 | | | 59 | | | 60 | | | 61 | | | 62 | | | 63 | | | 64 | | | 65 | | | 66 | | | 67 | | | 68 | | | 69 | | | 70 | | | 71 | | | 72 | | | 73 | | | 74 | | | 75 | | | 76 | | | 77 | | | 78 | | | 79 | | | 80 | | | 81 | | | 82 | | | 83 | | | 84 | | | 85 | | | 86 | | | 87 | | | 88 | | | 89 | | | 90 | | | 91 | | | 92 | | | 93 | | | 94 | | | 95 | | | 96 | | | 97 | | | 98 | | | 99 | | | 100 | | | 101 | | | 102 | | | 103 | | | 104 | | | 105 | | | 106 | | | 107 | | | 108 | | | 109 | | | 110 | | | 111 | | | 112 | | | 113 | | | 114 | | | 115 | | | 116 | | | 117 | | | 118 | | | 119 | | | 120 | | | 121 | | | 122 | | | 123 | | | 124 | | | 125 | | | 126 | | | 127 | | | 128 | | | 129 | | | 130 | | | 131 | | | 132 | | | 133 | | | 134 | | | 135 | | | 136 | | | 137 | | | 138 | | | 139 | | | 140 | | | 141 | | | 142 | | | 143 | | | 144 | | | 145 | | | 146 | | | 147 | | | 148 | | | 149 | | | 150 | | | 151 | | | 152 | | | 153 | | | 154 | | | 155 | | | 156 | | | 157 | | | 158 | | | 159 | | | 160 | | | 161 | | | 162 | | | 163 | | | 164 | | | 165 | | | 166 | | | 167 | | | 168 | | | 169 | | | 170 | | | 171 | | | 172 | | | 173 | | | 174 | | | 175 | | | 176 | | | 177 | | | 178 | | | 179 | | | 180 | | | 181 | | | 182 | | | 183 | | | 184 | | | 185 | | | 186 | | | 187 | | | 188 | | | 189 | | | 190 | | | 191 | | | 192 | | | 193 | | | 194 | | | 195 | |
|
/*---------------------------------------------------------------*/
| /*
| Titre : Affiche un nombre en chiffres romains
|
| URL : https://phpsources.net/code_s.php?id=1188
| Date édition : 02 Fev 2026
| Date mise a jour : 02 Fev 2026
|
| Rapport de la maj:
| - fonctionnement du code vérifié
| Date mise a jour : 16 Fev 2026
|
| Rapport de la maj:
| - amélioration du code
| - refactoring du code en PHP 8
| - modification de la description
| */
| /*---------------------------------------------------------------*/
|
| declare(strict_types=1);
|
| class RomanNumerals
| {
| /**
| * Convertit un nombre en chiffres romains
| *
| * @param int $num Nombre à convertir (1 - 3,999,999)
| * @return string Nombre en chiffres romains
| * @throws InvalidArgumentException Si le nombre est hors limites
| */
| public static function toRoman(int $num): string
| {
| if ($num < 1 || $num > 3_999_999) {
| throw new InvalidArgumentException(
| "Le nombre doit être entre 1 et 3,999,999 (actuel: $num)"
| );
| }
|
| // Tableaux de conversion (ordre décroissant important)
| $map = [
| 1_000_000 => '(M)', // 1 million
| 900_000 => '(CM)', // 900,000
| 500_000 => '(D)', // 500,000
| 400_000 => '(CD)', // 400,000
| 100_000 => '(C)', // 100,000
| 90_000 => '(XC)', // 90,000
| 50_000 => '(L)', // 50,000
| 40_000 => '(XL)', // 40,000
| 10_000 => '(X)', // 10,000
| 9_000 => '(IX)', // 9,000
| 5_000 => '(V)', // 5,000
| 4_000 => '(IV)', // 4,000
| 1_000 => 'M', // 1,000
| 900 => 'CM', // 900
| 500 => 'D', // 500
| 400 => 'CD', // 400
| 100 => 'C', // 100
| 90 => 'XC', // 90
| 50 => 'L', // 50
| 40 => 'XL', // 40
| 10 => 'X', // 10
| 9 => 'IX', // 9
| 5 => 'V', // 5
| 4 => 'IV', // 4
| 1 => 'I', // 1
| ];
|
| $result = '';
|
| foreach ($map as $value => $roman) {
| while ($num >= $value) {
| $result .= $roman;
| $num -= $value;
| }
| }
|
| return $result;
| }
|
| /**
| * Convertit des chiffres romains en nombre
| *
| * @param string $roman Chiffres romains
| * @return int Nombre décimal
| */
| public static function fromRoman(string $roman): int
| {
| $roman = strtoupper(trim($roman));
|
| // Support des parenthèses pour grands nombres
| $map = [
| '(M)' => 1_000_000,
| '(CM)' => 900_000,
| '(D)' => 500_000,
| '(CD)' => 400_000,
| '(C)' => 100_000,
| '(XC)' => 90_000,
| '(L)' => 50_000,
| '(XL)' => 40_000,
| '(X)' => 10_000,
| '(IX)' => 9_000,
| '(V)' => 5_000,
| '(IV)' => 4_000,
| 'M' => 1_000,
| 'CM' => 900,
| 'D' => 500,
| 'CD' => 400,
| 'C' => 100,
| 'XC' => 90,
| 'L' => 50,
| 'XL' => 40,
| 'X' => 10,
| 'IX' => 9,
| 'V' => 5,
| 'IV' => 4,
| 'I' => 1,
| ];
|
| $result = 0;
| $i = 0;
| $length = strlen($roman);
|
| while ($i < $length) {
| // Vérifie les combinaisons de 2+ caractères d'abord
| foreach ([5, 4, 3, 2, 1] as $len) {
| if ($i + $len <= $length) {
| $substr = substr($roman, $i, $len);
| if (isset($map[$substr])) {
| $result += $map[$substr];
| $i += $len;
| continue 2;
| }
| }
| }
| $i++; // Caractère invalide, on continue
| }
|
| return $result;
| }
| }
|
| /**
| * VERSION SIMPLE ET COMPATIBLE
| * Support étendu : 1 à 999,999
| */
| function chif_rome(int $num): string
| {
| if ($num < 1 || $num > 999_999) {
| return "Erreur : nombre hors limites (1-999,999)";
| }
|
| // Unités (1-9)
| $rome = ["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"];
|
| // Dizaines (10-90)
| $rome2 = ["", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"];
|
| // Centaines (100-900)
| $rome3 = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"];
|
| // Milliers (1,000-9,000) - CORRIGÉ
| $rome4 = ["", "M", "MM", "MMM", "(IV)", "(V)", "(VI)", "(VII)", "(VIII)",
| "(IX)"];
|
| // Dizaines de milliers (10,000-90,000) - NOUVEAU
| $rome5 = ["", "(X)", "(XX)", "(XXX)", "(XL)", "(L)", "(LX)", "(LXX)",
| "(LXXX)", "(XC)"];
|
| // Centaines de milliers (100,000-900,000) - NOUVEAU
| $rome6 = ["", "(C)", "(CC)", "(CCC)", "(CD)", "(D)", "(DC)", "(DCC)",
| "(DCCC)", "(CM)"];
|
| $str = '';
|
| // Centaines de milliers
| $str .= $rome6[intdiv($num, 100_000) % 10];
|
| // Dizaines de milliers
| $str .= $rome5[intdiv($num, 10_000) % 10];
|
| // Milliers
| $str .= $rome4[intdiv($num, 1_000) % 10];
|
| // Centaines
| $str .= $rome3[intdiv($num, 100) % 10];
|
| // Dizaines
| $str .= $rome2[intdiv($num, 10) % 10];
|
| // Unités
| $str .= $rome[$num % 10];
|
| return $str;
| }
| | ?> |
|