About Roman Numeral
Roman Numeral converts in both directions between ordinary numbers and Roman notation. The mode selector decides which way it runs: with Number to Roman you enter digits and get letters, and with Roman to Number you enter letters and get digits.
The conversion to Roman numerals covers the range one to three thousand nine hundred and ninety-nine, using the standard symbol set M, D, C, L, X, V and I with the subtractive pairs CM, CD, XC, XL, IX and IV. Anything outside that range returns an explicit out-of-range message instead of producing a sequence of Ms that would not be conventional Roman notation.
The reverse direction is deliberately more forgiving than the forward one. It reads the string left to right and subtracts a symbol when the next one is larger, which is how the subtractive convention works — but it does not reject non-standard spellings. Four written as IIII still returns 4, and a construction such as IC returns 99 even though a Roman author would have written XCIX. Unrecognised characters contribute nothing rather than raising an error, so the parser answers the question the input implies even when the notation is unconventional.
How to use Roman Numeral
- 1 Choose the direction with the mode selector.
- 2 Enter digits for Number to Roman, or Roman letters for Roman to Number.
- 3 Read the converted value.
Frequently asked questions
What is the largest number it converts?
3,999. Beyond that the conventional notation stops being a simple symbol sequence, and producing rows of Ms would misrepresent it, so numbers outside the range one to 3,999 return an out-of-range message instead.
Why does it accept 4 as IIII?
The reverse parser implements the subtractive rule but does not enforce canonical spelling, so additive forms that were historically used on clock faces and in ledger books still convert correctly. It reads what is written rather than validating it first.
How does it handle lowercase letters?
Case is ignored — the input is upper-cased before parsing. Lowercase Roman numerals commonly appear in page numbering and bibliographies, so mixed case converts exactly as uppercase does.
What does it do with a letter that is not a Roman numeral?
It contributes zero to the total, and the rest of the string is still parsed. That makes the tool tolerant of stray whitespace or punctuation, but it also means a mistyped letter will quietly reduce the result rather than flagging the typo.
Free, online, and private
Free to use
Roman Numeral is completely free. There is no account to create, no login, and no hidden charge or usage limit.
Runs online in your browser
It is a free online tool that runs entirely in your browser. Nothing to download or install — open the page and start using it right away.
Your data stays private
All processing happens locally on your device. Your input is never uploaded, stored, or tracked, so it never leaves your browser.
How Roman Numeral behaves in detail
These are the specifics of this implementation — the exact ranges, defaults and fixed settings you are working with.
| Parameter | Value |
|---|---|
| Modes | two, chosen from a select — number to Roman, and Roman to number — with number to Roman as the default |
| Symbol table | 13 value and symbol pairs running from 1000/M down to 1/I, including the six subtractive forms 900, 400, 90, 40, 9 and 4 |
| Accepted numbers | 1 – 3999 in the number-to-Roman direction; anything outside returns the text "Out of range (1-3999)" |
| Reverse mapping | a 7-entry lookup for I, V, X, L, C, D and M — subtractive pairs are inferred from the ordering, not listed |
| Case handling | the Roman input is upper-cased before each character is looked up |
| Unknown characters | contribute 0 — a character outside the seven symbols is a miss, not an error |
Compiled from the implementation of this tool and checked against it by itoolnet.
What Roman Numeral does not do
Knowing the edges of a tool saves more time than another list of its features. These are the cases where it will not do what you might expect.
- The Roman-to-number direction validates nothing. "IIII" comes back as 4 and "MMMM" as 4000 even though neither is a properly formed numeral, and a string containing no recognised symbol at all returns 0, so malformed input is answered with a number instead of being refused.
- Only the seven letters are understood, with no overline or other convention for larger values — which is precisely why the other direction stops at 3999 rather than using the barred forms that classical inscriptions relied on.
- In number mode the free-text box is put through Number() and Math.floor() without a validity check. Text that is not numeric becomes NaN, which fails both range comparisons and matches no table entry, so the result line comes back empty rather than saying the input was out of range.
Tested and documented by itoolnet, the team that builds and maintains this site.