aboutsummaryrefslogtreecommitdiff
path: root/Java/Beginer training/src/NumberName.java
blob: 34f735ceece97d2ae37f5d11f981dd68e175344f (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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
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<Integer>();

        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";
    }
}