DevToys Web Pro iconDevToys Web ProБлог
Переведено с помощью LocalePack logoLocalePack
Оцените нас:
Попробуйте расширение для браузера:
← Назад к блогу

Руководство по римским цифрам: правила, конвертация и применение

9 мин чтения

Римские цифры встречаются на циферблатах часов, в титрах фильмов, в именах монархов (Карл III, Людовик XIV), в логотипах Суперкубка и в конце уведомлений об авторских правах:MMXXVI. Они пережили Римскую империю на пятнадцать веков и не собираются исчезать. Если вы работаете с метаданными публикаций, юридическими документами или развлекательными данными, рано или поздно вам придётся правильно разбирать или генерировать их. Воспользуйтесь Конвертером римских цифр, чтобы следить за примерами в этом руководстве.

Семь базовых символов

Вся система римских цифр построена на семи буквах. Каждая соответствует фиксированному арабскому значению:

СимволЗначениеПроисхождение
I1Один палец
V5Открытая рука (V-образная форма между большим и остальными пальцами)
X10Две скрещённые руки или две фигуры V
L50Половина C (ранняя форма)
C100Лат. centum (сто)
D500Половина M (ранняя форма)
M1000Лат. 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).

Шесть субтрактивных пар полностью:

РимскаяЗначениеПравило
IV4I перед V
IX9I перед X
XL40X перед L
XC90X перед C
CD400C перед D
CM900C перед M

Типичная ошибка — считать любое «меньшее перед большим» допустимым. Например, IL для 49 некорректно. Правильно — XLIX (XL + IX). Аналогично, IC — не 99; верная форма — XCIX.

Разбор примера: MCMLXXXIV = 1984

1984 год — один из наиболее цитируемых примеров, так как он задействует субтрактивные пары из сотен и десятков. Разбор по символам:

ТокенЗначениеНакопленная сумма
M+10001000
CM+900 (C перед M: 1000 − 100)1900
L+501950
XXX+30 (10 + 10 + 10)1980
IV+4 (I перед V: 5 − 1)1984

Алгоритм: сканируйте слева направо. Если текущий символ меньше следующего — добавьте разницу (следующий − текущий) и пропустите два символа. Иначе — добавьте значение текущего символа и перейдите к следующему.

Ограничения системы

Система римских цифр имеет три жёстких ограничения, которые должна учитывать любая реализация:

  • Нет нуля. В латинском языке не было понятия нуля как числа. Ноль нельзя представить стандартными римскими цифрами. Попытка конвертировать 0 должна возвращать ошибку или пустую строку, но не «O» (это буква, а не символ).
  • Нет отрицательных чисел. В системе нет знака минус. Отрицательные входные данные не определены.
  • Максимум 3999. При стандартных символах максимальное выразимое число — MMMCMXCIX (3999). Четыре M подряд (MMMM) нестандартны в строгой нотации, хотя широко принимаются в неформальном использовании. Строгие валидаторы их отклоняют.

Для чисел выше 3999 средневековые рукописи использовали надстрочную черту (vinculum) — горизонтальную черту над символом, умножающую его значение на 1000. = 5 000, = 10 000, = 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-видимые даты. Церемонии награждений и спортивные события, которые появляются в результатах поиска, выигрывают от года в узнаваемом формате. Церемонии Оскара нумеруются римскими порядковыми номерами — это число появляется в заголовках новостей и структурированных данных.
  • Традиционно закреплённые области. Требования к обязательному экземпляру, стандарты часового производства и литургическая типографика закрепили римские цифры через инерцию. Ни один отдельный участник не имеет достаточного стимула менять то, что уже знают все остальные в этой области.

Для разработчика практический вывод таков: вы встретите римские цифры в данных, и ваш парсер должен обрабатывать как строгий, так и мягкий ввод с чётко задокументированным поведением. Используйте Конвертер римских цифр для проверки граничных случаев в процессе разработки. Для работы с другими системами счисления обратитесь к руководствам по конвертации систем счисления и конвертерам данных.


Мгновенно конвертируйте между римскими и арабскими цифрами прямо в браузере с помощью Конвертера римских цифр — без сервера, данные не покидают ваш компьютер.