Skip to content

Commit 305b369

Browse files
authored
arthurshur@gmail.com (#13275)
* Creating a deep vs shallow copy of an object in Java * Creating a deep vs shallow copy of an object in Java * Baeldung article converting number bases * Baeldung article converting number bases * edits made to Converting a Number from One Base to Another in Java * added braces to oneliners * added precondition to check input
1 parent 1b25127 commit 305b369

2 files changed

Lines changed: 42 additions & 22 deletions

File tree

core-java-modules/core-java-lang-5/src/main/java/com/baeldung/convertnumberbases/ConvertNumberBases.java

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,68 +2,76 @@
22

33
public class ConvertNumberBases {
44

5-
public static String convertNumberToNewBase(String number, int base, int newBase){
5+
public static String convertNumberToNewBase(String number, int base, int newBase) {
66
return Integer.toString(Integer.parseInt(number, base), newBase);
77
}
8+
89
public static String convertNumberToNewBaseCustom(String num, int base, int newBase) {
910
int decimalNumber = convertFromAnyBaseToDecimal(num, base);
10-
return convertFromDecimalToBaseX(decimalNumber, newBase);
11+
String targetBase = "";
12+
try {
13+
targetBase = convertFromDecimalToBaseX(decimalNumber, newBase);
14+
} catch (IllegalArgumentException e) {
15+
e.printStackTrace();
16+
}
17+
return targetBase;
1118
}
1219

13-
public static String convertFromDecimalToBaseX(int num, int newBase) {
20+
public static String convertFromDecimalToBaseX(int num, int newBase) throws IllegalArgumentException {
21+
if ((newBase < 2 || newBase > 10) && newBase != 16) {
22+
throw new IllegalArgumentException("New base must be from 2 - 10 or 16");
23+
}
1424

1525
String result = "";
1626
int remainder;
1727
while (num > 0) {
1828
remainder = num % newBase;
1929
if (newBase == 16) {
20-
if (remainder == 10)
30+
if (remainder == 10) {
2131
result += 'A';
22-
else if (remainder == 11)
32+
} else if (remainder == 11) {
2333
result += 'B';
24-
else if (remainder == 12)
34+
} else if (remainder == 12) {
2535
result += 'C';
26-
else if (remainder == 13)
36+
} else if (remainder == 13) {
2737
result += 'D';
28-
else if (remainder == 14)
38+
} else if (remainder == 14) {
2939
result += 'E';
30-
else if (remainder == 15)
40+
} else if (remainder == 15) {
3141
result += 'F';
32-
else
42+
} else {
3343
result += remainder;
34-
} else
44+
}
45+
} else {
3546
result += remainder;
36-
47+
}
3748
num /= newBase;
3849
}
3950
return new StringBuffer(result).reverse().toString();
4051
}
4152

4253
public static int convertFromAnyBaseToDecimal(String num, int base) {
43-
44-
if (base < 2 || (base > 10 && base != 16))
54+
if (base < 2 || (base > 10 && base != 16)) {
4555
return -1;
46-
56+
}
4757
int val = 0;
4858
int power = 1;
49-
5059
for (int i = num.length() - 1; i >= 0; i--) {
5160
int digit = charToDecimal(num.charAt(i));
52-
53-
if (digit < 0 || digit >= base)
61+
if (digit < 0 || digit >= base) {
5462
return -1;
55-
63+
}
5664
val += digit * power;
5765
power = power * base;
5866
}
59-
6067
return val;
6168
}
6269

6370
public static int charToDecimal(char c) {
64-
if (c >= '0' && c <= '9')
71+
if (c >= '0' && c <= '9') {
6572
return (int) c - '0';
66-
else
73+
} else {
6774
return (int) c - 'A' + 10;
75+
}
6876
}
6977
}

core-java-modules/core-java-lang-5/src/test/java/com/baeldung/convertnumberbases/ConvertNumberBasesUnitTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.baeldung.convertnumberbases;
22

3+
import static com.baeldung.convertnumberbases.ConvertNumberBases.convertFromDecimalToBaseX;
34
import static com.baeldung.convertnumberbases.ConvertNumberBases.convertNumberToNewBase;
45
import static com.baeldung.convertnumberbases.ConvertNumberBases.convertNumberToNewBaseCustom;
56
import static org.junit.jupiter.api.Assertions.*;
@@ -17,4 +18,15 @@ void whenConvertingBase2NumberToBase8_ThenResultShouldBeDigitsInBase8() {
1718
assertEquals(convertNumberToNewBaseCustom("11001000", 2, 8), "310");
1819
}
1920

21+
@Test
22+
void whenInputIsOutOfRange_thenIllegalArgumentExceptionIsThrown() {
23+
Exception exception = assertThrows(IllegalArgumentException.class, ()-> {
24+
convertFromDecimalToBaseX(100, 12);
25+
});
26+
String expectedMessage = "New base must be from 2 - 10 or 16";
27+
String actualMessage = exception.getMessage();
28+
29+
assertTrue(actualMessage.contains(expectedMessage));
30+
}
31+
2032
}

0 commit comments

Comments
 (0)