Skip to content

feat: add conversion logic from integer to english #5540

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Oct 4, 2024
1 change: 1 addition & 0 deletions DIRECTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
* [HexaDecimalToBinary](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/HexaDecimalToBinary.java)
* [HexaDecimalToDecimal](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/HexaDecimalToDecimal.java)
* [HexToOct](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/HexToOct.java)
* [IntegerToEnglish] (https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/IntegerToEnglish.java)
* [IntegerToRoman](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/IntegerToRoman.java)
* [OctalToBinary](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/OctalToBinary.java)
* [OctalToDecimal](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/OctalToDecimal.java)
Expand Down
116 changes: 116 additions & 0 deletions src/main/java/com/thealgorithms/conversions/IntegerToEnglish.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package com.thealgorithms.conversions;

import java.util.HashMap;

public final class IntegerToEnglish {
private static final HashMap<Integer, String> BASE_NUMBERS_MAP = new HashMap<>() {
{
put(0, "");
put(1, "One");
put(2, "Two");
put(3, "Three");
put(4, "Four");
put(5, "Five");
put(6, "Six");
put(7, "Seven");
put(8, "Eight");
put(9, "Nine");
put(10, "Ten");
put(11, "Eleven");
put(12, "Twelve");
put(13, "Thirteen");
put(14, "Fourteen");
put(15, "Fifteen");
put(16, "Sixteen");
put(17, "Seventeen");
put(18, "Eighteen");
put(19, "Nineteen");
put(20, "Twenty");
put(30, "Thirty");
put(40, "Forty");
put(50, "Fifty");
put(60, "Sixty");
put(70, "Seventy");
put(80, "Eighty");
put(90, "Ninety");
put(100, "Hundred");
}
};

private static final HashMap<Integer, String> THOUSAND_POWER_MAP = new HashMap<>() {
{
put(1, "Thousand");
put(2, "Million");
put(3, "Billion");
}
};

private IntegerToEnglish() {
}

/**
converts numbers < 1000 to english words
*/
private static String convertToWords(int number) {
int remainder = number % 100;

String result;

if (remainder <= 20) {
result = BASE_NUMBERS_MAP.get(remainder);
} else if (BASE_NUMBERS_MAP.containsKey(remainder)) {
result = BASE_NUMBERS_MAP.get(remainder);
} else {
int tensDigit = remainder / 10;
int onesDigit = remainder % 10;

result = String.format("%s %s", BASE_NUMBERS_MAP.get(tensDigit * 10), BASE_NUMBERS_MAP.get(onesDigit));
}

int hundredsDigit = number / 100;

if (hundredsDigit > 0) {
result = String.format("%s %s%s", BASE_NUMBERS_MAP.get(hundredsDigit), BASE_NUMBERS_MAP.get(100), result.isEmpty() ? "" : " " + result);
}

return result;
}

/**
Only convert groups of three digit if they are non-zero
*/
public static String integerToEnglishWords(int number) {
if (number == 0) {
return "Zero";
}

StringBuilder result = new StringBuilder();

int index = 0;

while (number > 0) {
int remainder = number % 1000;
number /= 1000;

if (remainder > 0) {
String subResult = convertToWords(remainder);

if (!subResult.isEmpty()) {
if (!result.isEmpty()) {
result.insert(0, subResult + " " + THOUSAND_POWER_MAP.get(index) + " ");
} else {
if (index > 0) {
result = new StringBuilder(subResult + " " + THOUSAND_POWER_MAP.get(index));
} else {
result = new StringBuilder(subResult);
}
}
}
}

index++;
}

return result.toString();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.thealgorithms.conversions;

import static org.junit.jupiter.api.Assertions.assertEquals;

import org.junit.jupiter.api.Test;

public class IntegerToEnglishTest {

@Test
public void testIntegerToEnglish() {
assertEquals("Two Billion One Hundred Forty Seven Million Four Hundred Eighty Three Thousand Six Hundred Forty Seven", IntegerToEnglish.integerToEnglishWords(2147483647));
assertEquals("One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven", IntegerToEnglish.integerToEnglishWords(1234567));
assertEquals("Twelve Thousand Three Hundred Forty Five", IntegerToEnglish.integerToEnglishWords(12345));
}
}