Руководство по римским цифрам: правила, конвертация и применение
Римские цифры встречаются на циферблатах часов, в титрах фильмов, в именах монархов (Карл III, Людовик XIV), в логотипах Суперкубка и в конце уведомлений об авторских правах:MMXXVI. Они пережили Римскую империю на пятнадцать веков и не собираются исчезать. Если вы работаете с метаданными публикаций, юридическими документами или развлекательными данными, рано или поздно вам придётся правильно разбирать или генерировать их. Воспользуйтесь Конвертером римских цифр, чтобы следить за примерами в этом руководстве.
Семь базовых символов
Вся система римских цифр построена на семи буквах. Каждая соответствует фиксированному арабскому значению:
| Символ | Значение | Происхождение |
|---|---|---|
| I | 1 | Один палец |
| V | 5 | Открытая рука (V-образная форма между большим и остальными пальцами) |
| X | 10 | Две скрещённые руки или две фигуры V |
| L | 50 | Половина C (ранняя форма) |
| C | 100 | Лат. centum (сто) |
| D | 500 | Половина M (ранняя форма) |
| M | 1000 | Лат. mille (тысяча) |
Обратите внимание на закономерность: каждый символ равен либо пяти, либо двум предыдущим. Чередующаяся структура — 1, 5, 10, 50, 100, 500, 1000 — позволяет записывать каждую цифру небольшим количеством символов.
Аддитивное правило
Если символ стоит перед символом равного или меньшего значения, значения складываются. Читая слева направо, вы накапливаете сумму:
- III = 1 + 1 + 1 = 3
- VIII = 5 + 1 + 1 + 1 = 8
- XXX = 10 + 10 + 10 = 30
- LXXX = 50 + 10 + 10 + 10 = 80
- DCCC = 500 + 100 + 100 + 100 = 800
Строгий современный стандарт допускает повторение каждого символа не более трёх раз подряд. Поэтому 4 записывается как IV, а не IIII — хотя на циферблатах часов традиционно используется именно IIII из соображений визуального баланса. Эта традиция прослеживается ещё к королевским часовщикам, которые намеренно избегали аббревиатуры, похожей на имя римского бога Юпитера (IVPITER). Достоверность легенды оспаривается, сама традиция — нет.
Субтрактивное правило
Если символ меньшего значения стоит перед символом большего значения, меньший вычитается из большего. Это называется субтрактивной нотацией, и правила строги:
- Субтрактивно могут использоваться только I, X и C. Символы V, L и D не могут стоять перед бо́льшими.
- I может стоять только перед V (даёт 4) или X (даёт 9).
- X может стоять только перед L (даёт 40) или C (даёт 90).
- C может стоять только перед D (даёт 400) или M (даёт 900).
Шесть субтрактивных пар полностью:
| Римская | Значение | Правило |
|---|---|---|
| IV | 4 | I перед V |
| IX | 9 | I перед X |
| XL | 40 | X перед L |
| XC | 90 | X перед C |
| CD | 400 | C перед D |
| CM | 900 | C перед M |
Типичная ошибка — считать любое «меньшее перед большим» допустимым. Например, IL для 49 некорректно. Правильно — XLIX (XL + IX). Аналогично, IC — не 99; верная форма — XCIX.
Разбор примера: MCMLXXXIV = 1984
1984 год — один из наиболее цитируемых примеров, так как он задействует субтрактивные пары из сотен и десятков. Разбор по символам:
| Токен | Значение | Накопленная сумма |
|---|---|---|
| M | +1000 | 1000 |
| CM | +900 (C перед M: 1000 − 100) | 1900 |
| L | +50 | 1950 |
| XXX | +30 (10 + 10 + 10) | 1980 |
| IV | +4 (I перед V: 5 − 1) | 1984 |
Алгоритм: сканируйте слева направо. Если текущий символ меньше следующего — добавьте разницу (следующий − текущий) и пропустите два символа. Иначе — добавьте значение текущего символа и перейдите к следующему.
Ограничения системы
Система римских цифр имеет три жёстких ограничения, которые должна учитывать любая реализация:
- Нет нуля. В латинском языке не было понятия нуля как числа. Ноль нельзя представить стандартными римскими цифрами. Попытка конвертировать 0 должна возвращать ошибку или пустую строку, но не «O» (это буква, а не символ).
- Нет отрицательных чисел. В системе нет знака минус. Отрицательные входные данные не определены.
- Максимум 3999. При стандартных символах максимальное выразимое число — MMMCMXCIX (3999). Четыре M подряд (MMMM) нестандартны в строгой нотации, хотя широко принимаются в неформальном использовании. Строгие валидаторы их отклоняют.
Для чисел выше 3999 средневековые рукописи использовали надстрочную черту (vinculum) — горизонтальную черту над символом, умножающую его значение на 1000. V̄ = 5 000, X̄ = 10 000, M̄ = 1 000 000. Это соглашение редко используется в современных контекстах, и большинство конвертеров его не поддерживают. Если вам нужно представлять большие римские числа программно — задокументируйте применяемое соглашение.
Типичные ошибки конвертации
Конвертеры римских цифр имеют удивительно богатую поверхность для ошибок. Вот наиболее частые проблемы в производственном коде:
- Принятие IIII как корректного. Многие наивные парсеры суммируют все символы слева направо и принимают IIII = 4. Строгий конвертер должен его отклонять. Определитесь заранее: ваш конвертер строгий (отклоняет IIII) или мягкий (принимает его)? Источники данных с циферблатов часто используют IIII.
- Отклонение MMMM. Симметричная проблема: некоторые строгие валидаторы отклоняют 4000, даже когда вызывающий код явно его требует. Если ваша область применения выходит за 3999 — задокументируйте ограничение или расширьте поддержку до MMMM.
- Строчный ввод. Римские цифры в реальных данных встречаются в обоих регистрах — кинотитры часто используют строчные (mmxxvi). Надёжный парсер должен либо нормализовать к верхнему регистру перед разбором, либо явно обрабатывать строчные буквы.
- Похожие символы. В кириллице есть символы, визуально идентичные латинским буквам: кириллическое «С» (U+0421) выглядит как латинское «C» (U+0043); кириллическое «І» (U+0406) — как латинское «I» (U+0049). В текстах, полученных из восточноевропейских источников, такие замены вызывают молчаливые ошибки разбора. Проверяйте, что все символы принадлежат латинскому блоку Unicode, до начала разбора.
- Недопустимые субтрактивные пары. Вводы типа IL (49), VX (5 перед 10), LC (50 перед 100) или DM (500 перед 1000) не являются корректными стандартными римскими цифрами. Строгий конвертер должен обнаруживать и отклонять их.
- Погрешность на 0 и 4000. Тестирование граничных значений — 0, 1, 3999, 4000 — выявляет большинство ошибок диапазона.
Современные практические применения
Римские цифры сохраняются в конкретных областях, ценящих традицию, престиж или визуальную самобытность:
- Циферблаты часов. Аналоговые часы часто используют римские цифры. Традиция IIII для 4 почти повсеместна на циферблатах, тогда как остальные цифры следуют стандартной форме. Парсер данных с циферблатов должен принимать IIII.
- Предварительные страницы книг. Предисловия, вступления и оглавления в традиционно оформленных книгах используют римские цифры для нумерации страниц (i, ii, iii, iv...) перед основным текстом. Инструменты обработки PDF часто должны отдельно обрабатывать эту схему нумерации.
- Монархи и папы. «Карл III» и «Бенедикт XVI» хранятся и ищутся как текст. Разбор порядкового номера требует обработки римских цифр, встроенных в строку имени.
- Суперкубок и Олимпийские игры. НФЛ использовала римские цифры для Суперкубков с I (1967) по XLIX, затем перешла на «50» для золотого юбилея и вернулась к LI и далее. Базы данных спортивных событий должны хранить и конвертировать оба представления.
- Уведомления об авторских правах. Кино- и телепроизводственные компании добавляют год первого показа в римских цифрах — MMXXVI для 2026 года. В некоторых юрисдикциях это правовая традиция. Разбор метаданных авторских прав из видеофайлов или HTML-страниц часто требует конвертера.
- Сиквелы фильмов и сериалов. Франшизы вроде Рокки, Звёздных войн и Форсажа используют римские цифры для номеров выпусков. Каноническое сопоставление названий в базах данных развлекательного контента требует нормализации.
Примеры кода
Следующие реализации охватывают оба направления конвертации со строгой валидацией. Это готовые к использованию отправные точки, а не минимальные наброски.
JavaScript / TypeScript
// Арабские в римские (строго, 1–3999)
const VAL_SYM: [number, string][] = [
[1000, "M"], [900, "CM"], [500, "D"], [400, "CD"],
[100, "C"], [90, "XC"], [50, "L"], [40, "XL"],
[10, "X"], [9, "IX"], [5, "V"], [4, "IV"],
[1, "I"],
];
function toRoman(n: number): string {
if (!Number.isInteger(n) || n < 1 || n > 3999) {
throw new RangeError(`Римские цифры определены для целых 1–3999, получено ${n}`);
}
let result = "";
for (const [value, symbol] of VAL_SYM) {
while (n >= value) {
result += symbol;
n -= value;
}
}
return result;
}
// Римские в арабские (строгий валидатор)
const ROMAN_VALUES: Record<string, number> = {
I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000,
};
const VALID_ROMAN = /^M{0,3}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/;
function fromRoman(s: string): number {
const upper = s.toUpperCase();
if (!VALID_ROMAN.test(upper) || upper.length === 0) {
throw new Error(`Некорректная римская цифра: "${s}"`);
}
let result = 0;
for (let i = 0; i < upper.length; i++) {
const curr = ROMAN_VALUES[upper[i]];
const next = ROMAN_VALUES[upper[i + 1]] ?? 0;
if (curr < next) {
result += next - curr;
i++;
} else {
result += curr;
}
}
return result;
}
console.log(toRoman(1984)); // "MCMLXXXIV"
console.log(fromRoman("MMXXVI")); // 2026Регулярное выражение VALID_ROMAN кодирует все структурные правила: M повторяется 0–3 раза, сотни могут быть CM/CD/D+0–3 C, десятки — XC/XL/L+0–3 X, единицы следуют той же схеме. Одной проверкой отклоняются IIII, IL, VX и все другие нестандартные формы.
Python
import re
VAL_SYM = [
(1000, "M"), (900, "CM"), (500, "D"), (400, "CD"),
(100, "C"), (90, "XC"), (50, "L"), (40, "XL"),
(10, "X"), (9, "IX"), (5, "V"), (4, "IV"),
(1, "I"),
]
ROMAN_VALUES = {"I": 1, "V": 5, "X": 10, "L": 50,
"C": 100, "D": 500, "M": 1000}
VALID_ROMAN = re.compile(
r"^M{0,3}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$"
)
def to_roman(n: int) -> str:
if not isinstance(n, int) or not (1 <= n <= 3999):
raise ValueError(f"Римские цифры определены для 1–3999, получено {n}")
result = []
for value, symbol in VAL_SYM:
while n >= value:
result.append(symbol)
n -= value
return "".join(result)
def from_roman(s: str) -> int:
upper = s.upper()
if not upper or not VALID_ROMAN.match(upper):
raise ValueError(f"Некорректная римская цифра: {s!r}")
result = 0
chars = list(upper)
i = 0
while i < len(chars):
curr = ROMAN_VALUES[chars[i]]
nxt = ROMAN_VALUES[chars[i + 1]] if i + 1 < len(chars) else 0
if curr < nxt:
result += nxt - curr
i += 2
else:
result += curr
i += 1
return result
print(to_roman(1984)) # MCMLXXXIV
print(from_roman("MMXXVI")) # 2026Только проверка регулярным выражением
Если нужно лишь проверить, является ли строка корректной римской цифрой, без конвертации — достаточно самого регулярного выражения:
const VALID_ROMAN = /^M{0,3}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/i;
// true — стандартная форма
VALID_ROMAN.test("MCMLXXXIV") // 1984
VALID_ROMAN.test("MMXXVI") // 2026
VALID_ROMAN.test("XIV") // 14
// false — нестандартные или некорректные
VALID_ROMAN.test("IIII") // отклонён
VALID_ROMAN.test("IL") // отклонён
VALID_ROMAN.test("VX") // отклонён
VALID_ROMAN.test("MMMM") // отклонён (4000 вне диапазона)
VALID_ROMAN.test("") // отклонён (пустая строка)Почему римские цифры сохраняются
С чисто функциональной точки зрения арабские цифры строго лучше: они поддерживают ноль, произвольную величину и десятичную арифметику без особых случаев. Римские цифры сохраняются по причинам, не связанным с арифметической эффективностью:
- Престиж и авторитетность. MMXXVI выглядит солиднее, чем 2026 в юридическом дисклеймере или кинотитрах. Буквенные формы несут культурный вес, накопленный за тысячелетия.
- Разграничение последовательностей. В документе, уже использующем арабские цифры для номеров страниц, версий и сносок, применение римских цифр для другой последовательности (предварительные страницы, номера актов, приложения) устраняет визуальную путаницу.
- SEO-видимые даты. Церемонии награждений и спортивные события, которые появляются в результатах поиска, выигрывают от года в узнаваемом формате. Церемонии Оскара нумеруются римскими порядковыми номерами — это число появляется в заголовках новостей и структурированных данных.
- Традиционно закреплённые области. Требования к обязательному экземпляру, стандарты часового производства и литургическая типографика закрепили римские цифры через инерцию. Ни один отдельный участник не имеет достаточного стимула менять то, что уже знают все остальные в этой области.
Для разработчика практический вывод таков: вы встретите римские цифры в данных, и ваш парсер должен обрабатывать как строгий, так и мягкий ввод с чётко задокументированным поведением. Используйте Конвертер римских цифр для проверки граничных случаев в процессе разработки. Для работы с другими системами счисления обратитесь к руководствам по конвертации систем счисления и конвертерам данных.
Мгновенно конвертируйте между римскими и арабскими цифрами прямо в браузере с помощью Конвертера римских цифр — без сервера, данные не покидают ваш компьютер.