罗马数字 与 阿拉伯数字 互转工具类

罗马数字 与 阿拉伯数字 互转工具类

在其它工具类上没找到,自己写了个工具类,以此记录:

/**
 * 罗马数字工具类
 *
 * @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;
        }
    }

}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值