罗马数字 与 阿拉伯数字 互转工具类
在其它工具类上没找到,自己写了个工具类,以此记录:
/**
* 罗马数字工具类
*
* @author pipizhen
* @since 2023-02-03 11:49
*/
public class RomanNumberUtil {
private static final String[] roman = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
private static final int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
/**
* 罗马数字 转 阿拉伯数字
*
* @param s 罗马数字
* @return int 阿拉伯数字,转换失败返回-1
* @author pipizhen
* @since 2023-02-03 10:54
*/
public static int romanToInt(String s) {
if (s == null || s.length() == 0) {
return -1;
}
try {
int sum = 0;
int preNum = getValueByRomanCharacter(s.charAt(0));
for (int i = 1; i < s.length(); i++) {
int num = getValueByRomanCharacter(s.charAt(i));
if (preNum < num) {
sum -= preNum;
} else {
sum += preNum;
}
preNum = num;
}
sum += preNum;
return sum;
} catch (Exception e) {
return -1;
}
}
/**
* 阿拉伯数字 转 罗马数字
*
* @param num 阿拉伯数字,范围为 1~3999
* @return java.lang.String 罗马数字
* @author pipizhen
* @since 2023-02-03 10:55
*/
public static String intToRoman(int num) {
if (num <= 0 || num >= 4000) {
throw new RuntimeException("num to roman, the num range is 1~3999");
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < values.length; i++) {
while (num >= values[i]) {
sb.append(roman[i]);
num -= values[i];
}
if (num == 0) {
break;
}
}
return sb.toString();
}
/**
* 获取单个字母的数字值
*
* @param ch 单个字母
* @return int 其表示的数字
* @author pipizhen
* @since 2023-02-03 10:54
*/
private static int getValueByRomanCharacter(char ch) {
switch (ch) {
case 'I':
return 1;
case 'V':
return 5;
case 'X':
return 10;
case 'L':
return 50;
case 'C':
return 100;
case 'D':
return 500;
case 'M':
return 1000;
default:
return 0;
}
}
}