[Issue 3230] New: std.conv should provide facilities for converting from Roman numerals.

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Aug 5 08:22:54 PDT 2009


http://d.puremagic.com/issues/show_bug.cgi?id=3230

           Summary: std.conv should provide facilities for converting from
                    Roman numerals.
           Product: D
           Version: 2.031
          Platform: All
        OS/Version: All
            Status: NEW
          Keywords: patch
          Severity: enhancement
          Priority: P2
         Component: Phobos
        AssignedTo: nobody at puremagic.com
        ReportedBy: dsimcha at yahoo.com


Pretty simple, without further ado here's the patch.  Just to be absolutely
clear, I wrote this code snippet entirely by myself and hereby release it into
the public domain.

// Converts a single digit from Roman to arabic.
private uint convertDigit(char digit) pure {
    switch(digit) {
        case 'I' :
            return 1;
        case 'V' :
            return 5;
        case 'X' :
            return 10;
        case 'L' :
            return 50;
        case 'C' :
            return 100;
        case 'D' :
            return 500;
        case 'M' :
            return 1000;
        default :
            throw new ConvError(
                "Could not convert Roman digit " ~ digit ~ " to a number.");
    }
    assert(0);
}

/**Converts a string containing a Roman numeral to an unsigned integer
 * representation.
 *
 * Throws:  ConvError on invalid Roman digit.
 */
uint romanToInt(const char[] roman) pure {
    uint result = 0;
    uint maxDigit = 0;

    for(size_t i = roman.length - 1; i != size_t.max; i--) {
        auto romanDigit = roman[i];
        uint arabic = convertDigit(romanDigit);

        if(arabic > maxDigit) {
            maxDigit = arabic;
        }

        // Should we add or subtract?
        if(arabic >= maxDigit) {
            result += arabic;
        } else {
            result -= arabic;
        }
    }
    return result;
}

unittest {
    assert(romanToInt("XIX") == 19);
    assert(romanToInt("DCLXVI") == 666);
    assert(romanToInt("XXX") == 30);
    assert(romanToInt("MDCCCLXXXVIII") == 1888);
    assert(romanToInt("XCIX") == 99);
    assert(romanToInt("XLIX") == 49);
    assert(romanToInt("IV") == 4);
    assert(romanToInt("XLV") == 45);
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list