aboutsummaryrefslogtreecommitdiff
path: root/Java/Number_Names/src/Program.java
blob: 6dabf734fcbf4a23b00be00d5191c6ca23e42e4d (plain) (blame)
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";
    }
}