[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