-
Notifications
You must be signed in to change notification settings - Fork 19.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
refactor: Enhance docs, remove
main
. add more tests in `HexaDecimal…
…ToDecimal`
- Loading branch information
Showing
2 changed files
with
56 additions
and
27 deletions.
There are no files selected for viewing
50 changes: 28 additions & 22 deletions
50
src/main/java/com/thealgorithms/conversions/HexaDecimalToDecimal.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,39 +1,45 @@ | ||
package com.thealgorithms.conversions; | ||
|
||
import java.util.Scanner; | ||
|
||
/** | ||
* Utility class for converting a hexadecimal string to its decimal representation. | ||
* <p> | ||
* A hexadecimal number uses the base-16 numeral system, with the following characters: | ||
* <ul> | ||
* <li>Digits: 0-9</li> | ||
* <li>Letters: A-F (case-insensitive)</li> | ||
* </ul> | ||
* Each character represents a power of 16. For example: | ||
* <pre> | ||
* Hexadecimal "A1" = 10*16^1 + 1*16^0 = 161 (decimal) | ||
* </pre> | ||
* | ||
* <p>This class provides a method to perform the conversion without using built-in Java utilities.</p> | ||
*/ | ||
public final class HexaDecimalToDecimal { | ||
private HexaDecimalToDecimal() { | ||
} | ||
|
||
// convert hexadecimal to decimal | ||
/** | ||
* Converts a hexadecimal string to its decimal integer equivalent. | ||
* <p>The input string is case-insensitive, and must contain valid hexadecimal characters [0-9, A-F].</p> | ||
* | ||
* @param hex the hexadecimal string to convert | ||
* @return the decimal integer representation of the input hexadecimal string | ||
* @throws IllegalArgumentException if the input string contains invalid characters | ||
*/ | ||
public static int getHexaToDec(String hex) { | ||
String digits = "0123456789ABCDEF"; | ||
hex = hex.toUpperCase(); | ||
int val = 0; | ||
|
||
for (int i = 0; i < hex.length(); i++) { | ||
int d = digits.indexOf(hex.charAt(i)); | ||
if (d == -1) { | ||
throw new IllegalArgumentException("Invalid hexadecimal character: " + hex.charAt(i)); | ||
} | ||
val = 16 * val + d; | ||
} | ||
return val; | ||
} | ||
|
||
// Main method gets the hexadecimal input from user and converts it into Decimal output. | ||
public static void main(String[] args) { | ||
String hexaInput; | ||
int decOutput; | ||
Scanner scan = new Scanner(System.in); | ||
|
||
System.out.print("Enter Hexadecimal Number : "); | ||
hexaInput = scan.nextLine(); | ||
|
||
// convert hexadecimal to decimal | ||
decOutput = getHexaToDec(hexaInput); | ||
/* | ||
Pass the string to the getHexaToDec function | ||
and it returns the decimal form in the variable decOutput. | ||
*/ | ||
System.out.println("Number in Decimal: " + decOutput); | ||
scan.close(); | ||
return val; | ||
} | ||
} |
33 changes: 28 additions & 5 deletions
33
src/test/java/com/thealgorithms/conversions/HexaDecimalToDecimalTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,14 +1,37 @@ | ||
package com.thealgorithms.conversions; | ||
|
||
import static org.junit.jupiter.api.Assertions.assertEquals; | ||
import static org.junit.jupiter.api.Assertions.assertThrows; | ||
|
||
import org.junit.jupiter.api.Test; | ||
import org.junit.jupiter.params.ParameterizedTest; | ||
import org.junit.jupiter.params.provider.CsvSource; | ||
|
||
public class HexaDecimalToDecimalTest { | ||
|
||
@Test | ||
public void testhexaDecimalToDecimal() { | ||
assertEquals(161, HexaDecimalToDecimal.getHexaToDec("A1")); | ||
assertEquals(428, HexaDecimalToDecimal.getHexaToDec("1ac")); | ||
@ParameterizedTest | ||
@CsvSource({ | ||
"A1, 161", // Simple case with two characters | ||
"1AC, 428", // Mixed-case input | ||
"0, 0", // Single zero | ||
"F, 15", // Single digit | ||
"10, 16", // Power of 16 | ||
"FFFF, 65535", // Max 4-character hex | ||
"7FFFFFFF, 2147483647" // Max positive int value | ||
}) | ||
public void | ||
testValidHexaToDecimal(String hexInput, int expectedDecimal) { | ||
assertEquals(expectedDecimal, HexaDecimalToDecimal.getHexaToDec(hexInput)); | ||
} | ||
|
||
@ParameterizedTest | ||
@CsvSource({ | ||
"G", // Invalid character | ||
"1Z", // Mixed invalid input | ||
"123G", // Valid prefix with invalid character | ||
"#$%" // Non-hexadecimal symbols | ||
}) | ||
public void | ||
testInvalidHexaToDecimal(String invalidHex) { | ||
assertThrows(IllegalArgumentException.class, () -> HexaDecimalToDecimal.getHexaToDec(invalidHex)); | ||
} | ||
} |