public static final Map<Character, Integer> romanMap =new HashMap()
{
{
put('I',1);
put('V',5);
put('X',10);
put('L',50);
put('C',100);
put('D',500);
put('M',1000);
}
};
/**
* 用于检验罗马数字规则的正则表达式
*/
private static final Stringregex ="^M{0,3}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$";
private static final Patternp = Pattern.compile(regex);
/**
* 判断罗马数字字符串是否合规
* @param s
* @return
*/
public boolean isRomanNumStr(String s) {
Matcher matcher =p.matcher(s);
return matcher.find();
}
/**
* 整数转罗马数字
* @param num 0~3999
* @return
*/
public static String intToRomanNum(int num) {
StringM[] = {"","M","MM","MMM" };
StringC[] = {"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM" };
StringX[] = {"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC" };
StringI[] = {"","I","II","III","IV","V","VI","VII","VIII","IX" };
return M[num /1000] + C[(num %1000) /100] + X[(num %100) /10] + I[num %10];
}
/**
* 罗马数字转整数
* @param romanStr
* @return
*/
public static int romanNumToInt(String romanStr) {
int result =0;
int length = romanStr.length();
// 遍历罗马数字组成的字符串
for(int i=0; i < length-1; i++) {
Character current = romanStr.charAt(i);
Character next = romanStr.charAt(i+1);
//若包含非罗马数字,返回-1以标识参数异常情况
if(romanMap.containsKey(current) &&romanMap.containsKey(next)) {
//罗马数字规则,前小后大 表示 后减前
if(romanMap.get(current)>=romanMap.get(next)) {
result +=romanMap.get(current);
}else {
result -=romanMap.get(current);
}
}else {
return -1;
}
}
//遍历时未处理最后一个罗马数
result +=romanMap.get(romanStr.charAt(length-1));
return result;
}