1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
import java.util.ArrayList;
import java.util.Scanner;
public class Program {
public static String[] digits = {"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
public static String[] teens = {"ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};
public static String[] tens = {"ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};
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 9223372036854775807 and –9223372036854775808 (any characters that are not numbers and - will result in error)");
while (true) {
try {
long n = Long.parseLong(scn.nextLine().trim());
System.out.println(NumberName(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 NumberName(long num) {
StringBuilder name = new StringBuilder(num < 0 ? "negative " : "");
var number_parts = new ArrayList<Long>();
if (num == 0) return "zero";
while (num != 0) {
number_parts.add(Math.abs(num % 1000));
num /= 1000;
}
for (int i = number_parts.size() - 1; i > -1; i--){
long curr_num = number_parts.get(i);
if ((curr_num + "").length() == 3) {
name.append(SmallNumberName((int)curr_num / 100)).append(" hundred");
curr_num %= 100;
if (curr_num != 0) name.append(" and ");
}
name.append(SmallNumberName((int)curr_num));
boolean to_determine = true;
switch (i) {
case 6:
if (number_parts.get(6) != 0) { //to_determine is always true when it reaches here
name.append(" trillion");
to_determine = false;
}
case 5:
if (number_parts.get(5) != 0 && to_determine) {
name.append(" billiard");
to_determine = false;
}
case 4:
if (number_parts.get(4) != 0 && to_determine) {
name.append(" billion");
to_determine = false;
}
case 3:
if (number_parts.get(3) != 0 && to_determine) {
name.append(" milliard");
to_determine = false;
}
case 2:
if (number_parts.get(2) != 0 && to_determine) {
name.append(" million");
to_determine = false;
}
case 1:
if (number_parts.get(1) != 0 && to_determine) {
name.append(" thousand");
to_determine = false;
}
if (number_parts.subList(0, i).stream().anyMatch(n -> n != 0) && !to_determine) {
if (number_parts.get(0) / 100 == 0) name.append(" and ");
else name.append(", ");
}
break;
}
}
return name.toString();
}
private static String SmallNumberName(int num) {
if (num < 20) {
try {
return digits[num];
} catch (Exception e) {
return teens[num % 10];
}
} else if (num < 100) {
return num % 10 == 0 ? tens[(num / 10) - 1] : tens[(num / 10) - 1] + "-" + SmallNumberName(num % 10);
}
return "ERR";
}
}
|