罗马数字和整数的互转

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;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。