Roman Numeral Conversion in Python

Published on (Updated: 02 May 2020)

Roman Numeral Conversion in Python

Welcome to the Roman Numeral in Python page! Here, you'll find the source code for this program as well as a description of how the program works.

Current Solution

import sys


# This function returns value of each Roman symbol
def value(r):
    return {
        'I': 1,
        'V': 5,
        'X': 10,
        'L': 50,
        'C': 100,
        'D': 500,
        'M': 1000
    }[r]


def roman_to_decimal(string):
    res = 0
    i = 0

    while i < len(string):

        # Getting value of symbol s[i]
        s1 = value(string[i])

        if i+1 < len(string):

            # Getting value of symbol s[i+1]
            s2 = value(string[i + 1])

            # Comparing both values
            if s1 >= s2:

                # Value of current symbol is greater
                # or equal to the next symbol
                res += s1
                i += 1
            else:

                # Value of current symbol is less than
                # to the next symbol
                res = res + s2 - s1
                i += 2
        else:
            res += s1
            i += 1

    return res


def exit_with_error(msg):
    print(msg)
    sys.exit(1)


def main(args):
    if len(args) < 1:
        exit_with_error('Usage: please provide a string of roman numerals')

    try:
        roman_numeral = sys.argv[1]
        print(roman_to_decimal(roman_numeral))
    except KeyError:
        exit_with_error('Error: invalid string of roman numerals')


if __name__ == '__main__':
    main(sys.argv[1:])

Roman Numeral in Python was written by:

If you see anything you'd like to change or update, please consider contributing.

Note: The solution shown above is the current solution in the Sample Programs repository as of Oct 15 2020 22:17:17. The solution was first committed on Oct 07 2018 01:40:26. As a result, documentation below may be outdated.

How to Implement the Solution

Solution

#!/usr/bin/env python
import sys


def value(r):
    return {
        'I': 1,
        'V': 5,
        'X': 10,
        'L': 50,
        'C': 100,
        'D': 500,
        'M': 1000
    }[r]


def roman_to_decimal(string):
    res = 0
    i = 0
    while i < len(string):
        s1 = value(string[i])
        if i + 1 < len(string):
            s2 = value(string[i + 1])
            if s1 >= s2:
                res += s1
                i += 1
            else:
                res = res + s2 - s1
                i += 2
        else:
            res += s1
            i += 1
    return res


def exit_with_error(msg):
    print(msg)
    sys.exit(1)


def main(args):
    if len(args) < 1:
        exit_with_error('Usage: please provide a string of roman numerals')
    try:
        roman_numeral = sys.argv[1]
        print(roman_to_decimal(roman_numeral))
    except KeyError:
        exit_with_error('Error: invalid string of roman numerals')


if __name__ == '__main__':
    main(sys.argv[1:])


The Main Function

Breaking down this solution bottom up,

if __name__ == "__main__":
    main(sys.argv[1:])

This bit of code checks to see if this is the main module run. If it is then it calls the main function and passes user input to it. In this case the user input would be a string "XV" (to convert from roman numeral to decimal number).

def main(args):
    if len(args) < 1:
        exit_with_error('Usage: please provide a string of roman numerals')
    try:
        roman_numeral = sys.argv[1]
        print(roman_to_decimal(roman_numeral))
    except KeyError:
        exit_with_error('Error: invalid string of roman numerals')

This is the main function of this file. It parses the input, then calls our roman to decimal function (and it also prints the results). It also deals with any errors raised.

Throw Errors

def exit_with_error(msg):
    print(msg)
    sys.exit(1)

This function prints a message and then exits the script with an error, sys.exit(1). If any non-zero value is returned then the program didn't complete properly. This function is called if the user input isn't correct.

Roman Numeral to Decimal number in Python

def roman_to_decimal(string):
    res = 0
    i = 0
    while i < len(string):
        s1 = value(string[i])
        if i + 1 < len(string):
            s2 = value(string[i + 1])
            if s1 >= s2:
                res += s1
                i += 1
            else:
                res = res + s2 - s1
                i += 2
        else:
            res += s1
            i += 1
    return res

Finally we're at the brain of the entire program. This function takes an roman numeral as string and returns in form of Decimal number(Integer type). This function roman_to_decimal has another function inside of it value. The nested function can map the each digit of roman numeral to decimal equivalent.

For example, if XV is the input:

How to Run the Solution

If we want to run this program, we should probably download a copy of roman_numeral_to_decimal in Python After that, we should make sure we have the latest Python interpreter. From there, we can run the following command in the terminal:

python roman_numeral_to_decimal.py "XIV"

Alternatively, we can copy the solution into an online Python interpreter and hit run then u need to modify sys.argv[i] to your inputs.