struct RomanNumeral { symbol: &'static str, value: u32 } const NUMERALS: [RomanNumeral; 13] = [ RomanNumeral {symbol: "M", value: 1000}, RomanNumeral {symbol: "CM", value: 900}, RomanNumeral {symbol: "D", value: 500}, RomanNumeral {symbol: "CD", value: 400}, RomanNumeral {symbol: "C", value: 100}, RomanNumeral {symbol: "XC", value: 90}, RomanNumeral {symbol: "L", value: 50}, RomanNumeral {symbol: "XL", value: 40}, RomanNumeral {symbol: "X", value: 10}, RomanNumeral {symbol: "IX", value: 9}, RomanNumeral {symbol: "V", value: 5}, RomanNumeral {symbol: "IV", value: 4}, RomanNumeral {symbol: "I", value: 1} ]; fn to_hindu(roman: &str) -> u32 { match NUMERALS.iter().find(|num| roman.starts_with(num.symbol)) { Some(num) => num.value + to_hindu(&roman[num.symbol.len()..]), None => 0, // if string empty, add nothing } } fn main() { let roms = ["MMXIV", "MCMXCIX", "XXV", "MDCLXVI", "MMMDCCCLXXXVIII"]; for &r in &roms { // 15 is minimum formatting width of the first argument, there for alignment println!("{:2$} = {}", r, to_hindu(r), 15); } }