diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/math/NumberUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/math/NumberUtil.java index 561a86959..2002662b0 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/math/NumberUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/math/NumberUtil.java @@ -1554,4 +1554,88 @@ public class NumberUtil extends NumberValidator { } return equals(toBigDecimal(n), BigDecimal.ZERO); } + + /** + * 整数转罗马数字
+ * 限制:[1,3999]的正整数 + * + * + * @param num [1,3999]的正整数 + * @return 罗马数字 + * @since 6.0.0 + * @author dazer + */ + public static String intToRoman(int num) { + if (num > 3999 || num < 1 ){ + return ""; + } + String[] thousands = {"", "M", "MM", "MMM"}; + String[] hundreds = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}; + String[] tens = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}; + String[] ones = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}; + + return thousands[num / 1000] + + hundreds[(num % 1000) / 100] + + tens[(num % 100) / 10] + + ones[num % 10]; + } + + /** + * 罗马数字转整数
+ * @param roman 罗马字符 + * @return 整数 + * @throws IllegalArgumentException 如果传入非罗马字符串,抛出异常 + * @since 6.0.0 + * @author dazer + */ + public static int romanToInt(String roman) { + int result = 0; + int prevValue = 0; + int currValue = 0; + + for (int i = roman.length() - 1; i >= 0; i--) { + char c = roman.charAt(i); + switch (c) { + case 'I': + currValue = 1; + break; + case 'V': + currValue = 5; + break; + case 'X': + currValue = 10; + break; + case 'L': + currValue = 50; + break; + case 'C': + currValue = 100; + break; + case 'D': + currValue = 500; + break; + case 'M': + currValue = 1000; + break; + default: + throw new IllegalArgumentException("Invalid Roman character: " + c); + } + if (currValue< prevValue) { + result -= currValue; + } else { + result += currValue; + } + + prevValue = currValue; + } + return result; + } }