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: nob...@puremagic.com ReportedBy: dsim...@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: -------