Effortlessly convert decimal numbers to Roman numerals in Python https://pypi.org/project/RomanPy/
Find a file
Michaël van de Weerd 902de66ec2
All checks were successful
/ test (push) Successful in 19s
/ lint (push) Successful in 1m6s
/ setup (push) Successful in 16s
/ build (push) Successful in 1m2s
/ publish (push) Successful in 1s
/ release (push) Successful in 16s
Merge pull request 'shields' (#4) from shields into develop
Reviewed-on: #4
2026-02-01 21:21:38 +01:00
.forgejo/workflows added forgejo workflow, update references to git repo 2026-02-01 17:33:10 +01:00
.idea Reimplemented roman numeral as subclass of int, improved variant support 2025-08-29 11:12:04 +02:00
assets Added icon asset 2025-08-15 23:30:55 +02:00
roman Reimplemented roman numeral as subclass of int, improved variant support 2025-08-29 11:12:04 +02:00
test Split the testcase 2023-03-02 08:01:52 +01:00
.coveragerc Added a simple CLI, updated CI and README 2025-08-15 23:25:39 +02:00
.gitignore Fix for coverage 2025-08-15 23:45:35 +02:00
LICENSE Added a simple CLI, updated CI and README 2025-08-15 23:25:39 +02:00
pyproject.toml bump version 2026-02-01 21:17:40 +01:00
pytest.ini Fix for coverage 2025-08-15 23:45:35 +02:00
README.MD update badges 2026-02-01 21:19:28 +01:00

RomanPy

release pypi develop master gitlab github

RomanPy is a Python library and CLI for converting decimal numbers to Roman numerals. It provides:

  • ASCII or Unicode output (with full support for Unicode numeral symbols)
  • Upper- and lowercase variants
  • Configurable numeral variants (subtractive, extended, apostrophus, medieval, zero, or custom mappings)
  • Arithmetic operations (+, -, *, //) between Roman numerals and integers
  • Equality and comparison with ints and strings

Licensed under the AGPLv3.0.

Installation

RomanPy is available on PyPI and can be installed using pip:

pip install RomanPy

Alternatively, you can pull the repository and install it straight from the source:

git clone git@forgejo.parcifal.dev:parcifal/roman-py.git
cd roman-py
pip install .

Usage (API)

Basic Conversion

from roman import roman

print(roman(207))  # CCVII

Encoding and Case Variants

n = roman(1776)

print(n.encode("ascii").upper())   # MDCCLXXVI
print(n.encode("ascii").lower())   # mdcclxxvi
print(n.encode("unicode").upper()) # ⅯⅮⅭⅭⅬⅩⅩⅥ
print(n.encode("unicode").lower()) # ⅿⅾⅽⅽⅼⅹⅹⅵ

Arithmetic with Roman Numerals

Roman numerals can be added, subtracted, multiplied, or divided with
other Roman numerals or integers:

print(roman(100) + roman(60))   # CLX
print(roman(45) - roman(7))     # XXXVIII
print(roman(533) * 2)           # MLXVI
print(roman(2460) // 10)        # CCXLVI

# mix with ints
print(100 + roman(60))          # CLX
print(roman(1954) == "MCMLIV")  # True

Custom Variants

You can extend or override numeral variants:

from roman.roman import VARIANT_ZERO

n = roman(0).extend_variant(VARIANT_ZERO)
print(n)  # N

Built-in variants include:

  • VARIANT_BASE (I, V, X, …)
  • VARIANT_SUBTRACTIVE (IV, IX, XL, …)
  • VARIANT_SUBTRACTIVE_EXTENDED (IIX, IC, …)
  • VARIANT_ZERO (N)
  • VARIANT_APOSTROPHUS (large numbers with I) and ((I)))
  • VARIANT_MEDIEVAL (A, Z, O, …)

By default, VARIANT_SUBTRACTIVE is used.

Usage (CLI)

Installing RomanPy also provides a roman command-line tool:

roman 42
# = XLII

Options

usage: roman [-h] [-a | -A | -u | -U] [-b | -s | -e] [-z] [-p] [-m] [-c DECIMAL NUMERAL] [-v] [-V] value

Convert a decimal number to roman numeral.

positional arguments:
  value                 a decimal number to convert to a roman numeral

optional arguments:
  -h, --help            show this help message and exit
  -a, --ascii           output encoding of roman numerals in lowercase ascii
  -A, --ASCII           output encoding of roman numerals in uppercase ascii (default)
  -u, --unicode         output encoding of roman numerals in lowercase unicode
  -U, --UNICODE         output encoding of roman numerals in uppercase unicode
  -b, --no-base         do not use the base variant
  -s, --subtractive     use the subtractive variant (includes base) (default)
  -e, --subtractive-extended
                        use the extended subtractive variant(includes subtractive)
  -z, --zero            use the zero variant N
  -p, --apostrophus     use the apostrophus method for large numbers
  -m, --medieval        use the medieval variant
  -c DECIMAL NUMERAL, --custom DECIMAL NUMERAL
                        map a decimal number to a roman numeral
  -v, --verbose         increase verbosity
  -V, --version         show program's version number and exit

Contributing

Found a bug? Have a suggestion? Open an issue or submit a merge request at the Forgejo repository. All contributions are welcome.