I have written a code for converting numbers to words considering the constraint 1<=number<=1000000000
(Indian Numbering System).
I have used a HashMap
in its implementation.
The problem is I can't get output for some special case numbers. Is there any alternate and efficient way of implementing this.
Code
import java.util.HashMap;
import java.util.Scanner;
public class NumberToString {
public static void main(String[] args) {
HashMap<Long, String> hm = new HashMap<Long, String>() {
{
put(0L, "Zero");
put(1L, "One");
put(2L, "Two");
put(3L, "Three");
put(4L, "Four");
put(5L, "Five");
put(6L, "Six");
put(7L, "Seven");
put(8L, "Eight");
put(9L, "Nine");
put(10L, "Ten");
put(11L, "Eleven");
put(12L, "Twelve");
put(13L, "Thirteen");
put(14L, "Fourteen");
put(15L, "Fifteen");
put(16L, "Sixteen");
put(17L, "Seventeen");
put(18L, "Eighteen");
put(19L, "Nineteen");
put(20L, "Twenty");
put(30L, "Thirty");
put(40L, "Fourty");
put(50L, "Fifty");
put(60L, "Sixty");
put(70L, "Seventy");
put(80L, "Eighty");
put(90L, "Ninety");
}
};
int multiplier = 1;
Scanner scanner = new Scanner(System.in);
System.out.println("Enter a number:");
String numberString = scanner.nextLine();
try {
if (Long.parseLong((numberString)) == 0) {
System.out.println("Enter a number greater than zero");
System.exit(0);
}
} catch (NumberFormatException e) {
System.out.println(numberString + "is not a number");
System.exit(0);
}
Long[] numberInteger = new Long[numberString.length()];
for (int i = 0; i < numberInteger.length; i++) {
numberInteger[i] = (long) (numberString.charAt(i) - '0');
}
for (int i = (numberInteger.length - 1); i >= 0; i--) {
numberInteger[i] = numberInteger[i] * multiplier;
multiplier = multiplier * 10;
}
int temp = 0;
for (int i = 0; i < numberInteger.length; i++) {
int counter = 0;
while (numberInteger[i] != 0 && numberInteger[i] % 10 == 0) {
counter++;
numberInteger[i] = numberInteger[i] / 10;
}
if (counter == 9)
System.out.print(hm.get(numberInteger[i]) + " hundred and ");
else if (counter == 8) {
if ((Long.parseLong(numberString)) % 10 == 0)
System.out.print(hm.get(numberInteger[i] * 10) + " crores ");
else
System.out.print(hm.get(numberInteger[i] * 10) + " ");
} else if (counter == 7)
System.out.print(hm.get(numberInteger[i]) + " crores ");
else if (counter == 6) {
if ((Long.parseLong(numberString)) % 10 == 0)
System.out.print(hm.get(numberInteger[i] * 10) + " lakhs ");
else
System.out.print(hm.get(numberInteger[i] * 10) + " ");
} else if (counter == 5)
System.out.print(hm.get(numberInteger[i]) + " lakhs ");
else if (counter == 4) {
if ((Long.parseLong(numberString)) % 10 == 0)
System.out.print(hm.get(numberInteger[i] * 10) + " thousand");
else
System.out.print(hm.get(numberInteger[i] * 10) + " ");
} else if (counter == 3)
System.out.print(hm.get(numberInteger[i]) + " thousand ");
else if (counter == 2)
System.out.print(hm.get(numberInteger[i]) + " hundred ");
else if (counter == 1) {
if (numberInteger[i] == 1) {
temp = 10;
continue;
} else
System.out.print(hm.get(numberInteger[i] * 10) + " ");
} else if (counter == 0) {
if (temp == 10)
System.out.print(hm.get(numberInteger[i] + temp));
if (numberInteger[i] > 0 && temp != 10)
System.out.print(hm.get(numberInteger[i]));
} else
System.out.print(hm.get(numberInteger[i]));
}
scanner.close();
}
}