-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathIntToStr.java
113 lines (98 loc) · 3.57 KB
/
IntToStr.java
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
package util;
/**
* Число в строку
*/
public class IntToStr {
/**
* Числа от 1 до 19
*/
static final String[] digits = {
"", "один", "два", "три",
"четыре", "пять", "шесть", "семь",
"восемь", "девять", "десять",
"одиннадцать", "двенадцать",
"тринадцать", "четырнадцать",
"пятнадцать", "шестнадцать", "семьнадцать",
"восемьнадцать", "девятьнадцать",
};
/**
* Десятки
*/
static final String[] decs = {
"", "", "двадцать", "тридцать",
"сорок", "пятьдесят", "шестьдесят",
"семьдесят", "восемьдесят",
"девяносто"
};
static final String hundreds[] = {
"", "сто", "двести", "триста", "четыреста", "пятьсот",
"шестьсот", "семьсот", "восемьсот", "девятьсот",
};
static final String[] digitsFemale;
// Статический конструктор
//-->
static {
// ... действия по инициализации класса
// в общем...
calls = 0; // Инициализация статической
// переменной
// Числительные в женском роде
digitsFemale = digits.clone();
digitsFemale[1] = "одна";
digitsFemale[2] = "две";
}
//<--
static String thousands[] = {"тысяч", "тысяча", "тысячи"};
static String millions[] = {"миллионов", "миллион", "миллиона"};
static String milliards[] = {"миллиардов", "миллиард", "миллиарда"};
static int calls;
private static int n;
final String result;
StringBuffer res = new StringBuffer();
long N;
//-->
public IntToStr(long n) {
N = n;
if (N == 0)
res.append("ноль");
addClass(1000000000, milliards);
addClass(1000000, millions);
addClass(1000, thousands);
addClass(1, null);
// Убираем начальные и конечные пробелы
String r = res.toString().trim();
// Делаем первую букву большой
result = r.substring(0, 1).toUpperCase() + r.substring(1);
}
// Число в строку
public static String intToStr(long N) {
return new IntToStr(N).result;
}
// Форма числительного в зависимости от числа
private static int numForm(int t) {
if (t == 1)
return 1;
if (t >= 2 && t <= 4)
return 2;
return 0;
}
private void addClass(long base, String[] names) {
if (N >= base) {
add(100 * base, 100 * base, hundreds); // Сотни
add(10 * base, 20 * base, decs); // Десятки
// Единицы
int t = (int) (N / base);
add(base, base, base == 1000 ? digitsFemale : digits);
if (names != null)
res.append(" ").append(names[numForm(t)]);
}
}
void add(long tens, long fromN, String[] names) {
if (N >= fromN) {
int h = (int) (N / tens);
res.append(" ").append(names[h]);
N -= h * tens;
}
}
//<--
}