Мой код рабочий и проходит все тестирования, но не принимается валидатором. Знаю, что можно решить проще, через BigInteger, но меня интересует, по каким критериям этот код не принимается?
public static Number convertNumberToOtherNumberSystem(Number number, NumberSystem expectedNumberSystem) {
//напишите тут ваш код
String controlString = "0123456789ABCDEF"; // шаблон для проверки
int numberSystem = number.getNumberSystem().getNumberSystemIntValue(); // система счисления переданного числа
String digit = number.getDigit().toUpperCase(); // переданное число в виде строки
Pattern pattern = Pattern.compile("[" + controlString.substring(0, numberSystem) + "]+");
//проверяем число на корректность (если число отрицательное или содержит
// непозволительный символ для его системы счисления, бросаем ошибку
if (!Pattern.matches(String.valueOf(pattern), digit)) {
throw new NumberFormatException();
}
// если перевод в ту же самую систему (пример: из 16 в 16)
// if (number.getNumberSystem() == expectedNumberSystem) {
// return number;
// }
//Перевод числа в десятичную систему
String reversDigit = new StringBuilder(digit).reverse().toString();
BigInteger digitToDecimalSystem = BigInteger.ZERO;
int discharge = 0;
for (int i = 0; i < digit.length(); i++) {
char currentChar = reversDigit.charAt(i);
// код который не примет компилятор
// int currentInt = switch (currentChar) {
// case 'A' -> 10;
// case 'B' -> 11;
// case 'C' -> 12;
// case 'D' -> 13;
// case 'E' -> 14;
// case 'F' -> 15;
// default -> Integer.parseInt(String.valueOf(currentChar));
// };
int currentInt;
if (currentChar == 'A') currentInt = 10;
else if (currentChar == 'B') currentInt = 11;
else if (currentChar == 'C') currentInt = 12;
else if (currentChar == 'D') currentInt = 13;
else if (currentChar == 'E') currentInt = 14;
else if (currentChar == 'F') currentInt = 15;
else currentInt = Integer.parseInt(String.valueOf(currentChar));
digitToDecimalSystem = digitToDecimalSystem.add(BigInteger.valueOf(currentInt * ((long)Math.pow(numberSystem, discharge))));
discharge++;
}
// **************************
// если десятичная - наша цель, возвращаем результат
if (expectedNumberSystem == NumberSystemType._10){
return new Number(NumberSystemType._10, digitToDecimalSystem + "");
}
BigInteger expectedNumberSystemToInt = BigInteger.valueOf(expectedNumberSystem.getNumberSystemIntValue());
String finishDigit = "";
BigInteger resultOfDividing = digitToDecimalSystem;
BigInteger remainderOfTheDivision;
while (true) {
remainderOfTheDivision = resultOfDividing.mod(expectedNumberSystemToInt);
resultOfDividing = resultOfDividing.divide(expectedNumberSystemToInt);
switch (remainderOfTheDivision.intValue()) {
case 10 : finishDigit = "A" + finishDigit; break;
case 11 : finishDigit = "B" + finishDigit; break;
case 12 : finishDigit = "C" + finishDigit; break;
case 13 : finishDigit = "D" + finishDigit; break;
case 14 : finishDigit = "E" + finishDigit; break;
case 15 : finishDigit = "F" + finishDigit; break;
default : finishDigit = remainderOfTheDivision + finishDigit;
}
if (resultOfDividing.intValue() == 0) break;
}
return new Number(expectedNumberSystem, finishDigit);
}