package cn.iocoder.yudao.framework.common.thealgorithms.conversions;

///**
// * @author Varun Upadhyay (<a href="https://github.com/varunu28">...</a>)
// */
//// Driver program
//public final class AnyBaseToDecimal {
//    private AnyBaseToDecimal() {
//    }
//
//    public static void main(String[] args) {
//        assert convertToDecimal("1010", 2) == Integer.valueOf("1010", 2);
//        assert convertToDecimal("777", 8) == Integer.valueOf("777", 8);
//        assert convertToDecimal("999", 10) == Integer.valueOf("999", 10);
//        assert convertToDecimal("ABCDEF", 16) == Integer.valueOf("ABCDEF", 16);
//        assert convertToDecimal("XYZ", 36) == Integer.valueOf("XYZ", 36);
//    }
//
//    /**
//     * Convert any radix to decimal number
//     *
//     * @param s the string to be convert
//     * @param radix the radix
//     * @return decimal of bits
//     * @throws NumberFormatException if {@code bits} or {@code radix} is invalid
//     */
//    public static int convertToDecimal(String s, int radix) {
//        int num = 0;
//        int pow = 1;
//
//        for (int i = s.length() - 1; i >= 0; i--) {
//            int digit = valOfChar(s.charAt(i));
//            if (digit >= radix) {
//                throw new NumberFormatException("For input string " + s);
//            }
//            num += valOfChar(s.charAt(i)) * pow;
//            pow *= radix;
//        }
//        return num;
//    }
//
//    /**
//     * Convert character to integer
//     *
//     * @param c the character
//     * @return represented digit of given character
//     * @throws NumberFormatException if {@code ch} is not UpperCase or Digit
//     * character.
//     */
//    public static int valOfChar(char c) {
//        if (!(Character.isUpperCase(c) || Character.isDigit(c))) {
//            throw new NumberFormatException("invalid character :" + c);
//        }
//        return Character.isDigit(c) ? c - '0' : c - 'A' + 10;
//    }
//}
/**
 * 作者 Varun Upadhyay (https://github.com/varunu28)
 */
// 驱动程序
public final class AnyBaseToDecimal {
    private AnyBaseToDecimal() {
    }

    public static void main(String[] args) {
        // 使用断言测试 convertToDecimal
        System.out.println(convertToDecimal("1010", 2));
        System.out.println(convertToDecimal("777", 8));
        System.out.println(convertToDecimal("999", 10));
        System.out.println(convertToDecimal("ABCDEF", 16));
        System.out.println(convertToDecimal("XYZ", 36));

        System.out.println("********************************");

        System.out.println(Integer.valueOf("1010", 2));
        System.out.println(Integer.valueOf("777", 8));
        System.out.println(Integer.valueOf("999", 10));
        System.out.println(Integer.valueOf("ABCDEF", 16));
        System.out.println(Integer.valueOf("XYZ", 36));
//
    }

    /**
     * 将任何基数转换为十进制数
     *
     * @param s 要转换的字符串
     * @param radix 基数
     * @return 位的十进制数
     * @throws NumberFormatException 如果 {@code bits} 或 {@code radix} 无效
     */
    public static int convertToDecimal(String s, int radix) {
        int num = 0;
        int pow = 1;

        // 从字符串的最后一个字符开始，向前遍历每个字符
        for (int i = s.length() - 1; i >= 0; i--) {
            // 将字符转换为整数值
            int digit = valOfChar(s.charAt(i));
            // 如果字符代表的数字大于或等于基数，则抛出异常
            if (digit >= radix) {
                throw new NumberFormatException("输入字符串无效 " + s);
            }
            // 将字符代表的数字乘以当前的权重并加到 num 上
            num += valOfChar(s.charAt(i)) * pow;
            // 更新权重
            pow *= radix;
        }
        return num;
    }

    /**
     * 将字符转换为整数
     *
     * @param c 字符
     * @return 给定字符的代表数字
     * @throws NumberFormatException 如果 {@code ch} 不是大写字母或数字字符
     */
    public static int valOfChar(char c) {
        // 如果字符不是大写字母或数字，则抛出异常
        if (!(Character.isUpperCase(c) || Character.isDigit(c))) {
            throw new NumberFormatException("无效字符：" + c);
        }
        // 如果字符是数字，则直接转换为数字；如果是大写字母，则转换为对应的数字（A=10, B=11, ...）
        return Character.isDigit(c) ? c - '0' : c - 'A' + 10;
    }
}
