import java.util.ArrayList; import java.math.*; import java.util.Scanner; public class NumberName { public static void main(String args[]){ //Used http://www.englishlessonsbrighton.co.uk/saying-large-numbers-english/ and https://www.grammarly.com/blog/hyphen-in-compound-numbers/ Scanner scn = new Scanner(System.in); System.out.println("Number to British English text"); System.out.println("How to use: type a whole number, press enter and the program will say it's full proper name. Close the program to stop it."); System.out.println("NOTE: Your numbers must be between 2147483647 and -2147483648 (any characters that are not numbers and - will result in error)"); while (true) { try { int n = Integer.parseInt(scn.nextLine().trim()); System.out.println(NameOfNumber(n)); } catch (Exception ex) { System.out.println("ERROR: Please type a whole number between 2147483647 and -2147483648 (NOTE: any characters that are not numbers and - will result in this error)"); } } } public static String NameOfNumber(int num) { StringBuilder name = new StringBuilder(num < 0 ? "negative " : ""); var number_parts = new ArrayList(); while (num != 0) { number_parts.add(Math.abs(num % 1000)); num /= 1000; } for (int i = number_parts.size() - 1; i > -1; i--){ int curr_num = number_parts.get(i); if ((curr_num + "").length() == 3) { name.append(SmallNumName(curr_num / 100)).append(" hundred"); curr_num %= 100; if (curr_num != 0) name.append(" and "); } name.append(SmallNumName(curr_num)); switch (i) { case 1: if (number_parts.get(1) != 0) { name.append(" thousand"); if (number_parts.get(0) != 0) { if (number_parts.get(0) / 100 == 0) name.append(" and "); else name.append(", "); } } break; case 2: if (number_parts.get(2) != 0) { name.append(" million"); if (number_parts.get(0) != 0 || number_parts.get(1) != 0) { if (number_parts.get(1) / 100 == 0) name.append(" and "); else name.append(", "); } } break; case 3: if (number_parts.get(3) != 0) { name.append(" milliard"); if (number_parts.get(0) != 0 || number_parts.get(1) != 0 || number_parts.get(2) != 0) { if (number_parts.get(2) / 100 == 0) name.append(" and "); else name.append(", "); } } break; } } return name.toString(); } private static String SmallNumName(int num) { int part = 1; switch (num) { case 0: return ""; case 1: return "one"; case 2: return "two"; case 3: return "three"; case 4: return "four"; case 5: return "five"; case 6: return "six"; case 7: return "seven"; case 8: return "eight"; case 9: return "nine"; case 10: return "ten"; case 11: return "eleven"; case 12: return "twelve"; case 13: return "thirteen"; case 15: return "fifteen"; case 18: return "eighteen"; case 14: part = 4; case 16: if (part == 1) part = 6; case 17: if (part == 1) part = 7; case 19: if (part == 1) part = 9; return SmallNumName(part) + "teen"; } if (num > 19 && num < 100) { int f_digit = num / 10; StringBuilder name = new StringBuilder(); switch (f_digit) { case 2: name.append("twenty"); break; case 3: name.append("thirty"); break; case 4: name.append("forty"); break; case 5: name.append("fifty"); break; case 8: name.append("eighty"); break; default: name.append(SmallNumName(f_digit)).append("ty"); break; } return num % 10 != 0 ? name + "-" + SmallNumName(num % 10) : name.toString(); } return "ERR"; } }