Roman 10
== "X"
>> Roman 115
== "CXV"
>> Roman 418
== "CDXVIII"
>> Roman "XIV"
== 14
>> Roman "XXIV"
== 24
>> Roman "IX"
== 9
>> Roman "LXXXI"
== 81
>> Roman "MCMLII"
== 1952
>> Roman "MMI"
== 2001
>> Roman "MMMCMXCIX"
== 3999
>> Roman 9
== "IX"
>> Roman 81
== "LXXXI"
>> Roman 1952
== "MCMLII"
>> Roman 2001
== "MMI"
>> Roman 3999
== "MMMCMXCIX"
Here is the source code:
REBOL [
Title: "Roman"
Date: 3-Jul-2002
Name: 'Roman
Version: 1.0.0
File: %roman.r
Author: "Andrew Martin"
Purpose: "Converts a Roman numeral to Arabic and reverse!"
eMail: Al.Bri@xtra.co.nz
Web: http://valley.150m.com
Acknowledgements: {Christian "CHE" Ensel}
]
Roman: function [
{Converts a Roman numeral to Arabic and reverse!
Returns 'none if it can't convert the number.}
[catch]
Number [string! integer!] {The Roman "MMMCMXCIX" or Arabic 3999 number to convert.}
][Roman-Arabic Result ][
throw-on-error [
Roman-Arabic: compose [
M 1000
CM (-100 + 1000)
D 500
CD (-100 + 500)
C 100
XC (-10 + 100)
L 50
XL (-10 + 50)
X 10
IX (-1 + 10)
V 5
IV (-1 + 5)
I 1
]
either string? Number [
Result: 0
if not parse/all Number [
0 3 ["M" (Result: Result + Roman-Arabic/M)]
opt [
"CM" (Result: Result + Roman-Arabic/CM)
| "D" (Result: Result + Roman-Arabic/D)
| "CD" (Result: Result + Roman-Arabic/CD)
]
0 3 ["C" (Result: Result + Roman-Arabic/C)]
opt [
"XC" (Result: Result + Roman-Arabic/XC)
| "L" (Result: Result + Roman-Arabic/L)
| "XL" (Result: Result + Roman-Arabic/XL)
]
0 3 ["X" (Result: Result + Roman-Arabic/X)]
opt [
"IX" (Result: Result + Roman-Arabic/IX)
| "V" (Result: Result + Roman-Arabic/V)
| "IV" (Result: Result + Roman-Arabic/IV)
]
0 3 ["I" (Result: Result + Roman-Arabic/I)]
end
][Result: none ]
][
if all [0 <= Number Number <= 3999] [
Result: make string! 10
foreach [Roman Arabic] Roman-Arabic [
while [Arabic <= Number][
append Result Roman
Number: Number - Arabic
]
]
]
]
Result
]
]
No comments:
Post a Comment