% dec_to_roman/1 : integer -> string
% format the integer num using roman numerals
decimal_to_roman(Num) ->
decimal_to_roman(Num, "",
[1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1],
["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX",
"V", "IV", "I"]).
% dec_to_roman/4 : integer string [t number) (list string) -> string
% append the numbers num formatted as roman numerals to the string s,
% using the roman numerals in roman-numbers with corresponding
% decimal values in decimal-values
decimal_to_roman(0, Accum, Decimals, Romans) -> Accum;
decimal_to_roman(Num, Accum, Decimals, Romans) ->
F_el = hd(Decimals),
if
F_el =< Num -> decimal_to_roman(Num - F_el,
Accum ++ hd(Romans),
Decimals, Romans);
true -> dec_to_roman(Num, Accum, tl(Decimals), tl(Romans))
end.
% Example of use:
1> decimal_to_roman(1997).
"MCMXCVII"
2> decimal_to_roman(1929).
"MCMXXIX"
3> decimal_to_roman(2112).
"MMCXII" |
% roman_to_decimal : string -> integer
% convert a string with (uppercase) roman numerals to an integer
roman_to_decimal("") -> 0;
roman_to_decimal(Str) ->
case length(Str) of
1 ->
case list_to_atom(Str) of
'I' -> 1;
'V' -> 5;
'X' -> 10;
'L' -> 50;
'C' -> 100;
'D' -> 500;
'M' -> 1000;
_ -> 0
end;
_ ->
roman_to_decimal( string:substr(Str, 3) )
+ case list_to_atom( string:substr(Str, 1, 2) ) of
'IV' -> 4;
'IX' -> 9;
'XL' -> 40;
'XC' -> 90;
'CD' -> 400;
'CN' -> 900;
_ -> roman_to_decimal( string:substr(Str, 1, 1) )
+ roman_to_decimal( string:substr(Str, 2, 1) )
end
end.
% Example of use:
4> roman_to_decimal("MM").
2000
5> roman_to_decimal("MMIII").
2003
6> roman_to_decimal("MMIIII").
2004
7> roman_to_decimal("MCMXM").
3110 |
| CookbookForm | |
|---|---|
| TopicType: | Recipe |
| ParentTopic: | NumberRecipes |
| TopicOrder: | 060 |