-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnum2word.lua
126 lines (111 loc) · 3.4 KB
/
num2word.lua
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
121
122
123
124
125
126
function num2word(sum)
local zero = "ноль"
local ones = {
"один",
"два",
"три",
"четыре",
"пять",
"шесть",
"семь",
"восемь",
"девять",
"десять",
"одиннадцать",
"двенадцать",
"тринадцать",
"четырнадцать",
"пятнадцать",
"шестнадцать",
"семнадцать",
"восемнадцать",
"девятнадцать"
}
local tens = {
"",
"двадцать",
"тридцать",
"сорок",
"пятьдесят",
"шестьдесят",
"семьдесят",
"восемьдесят",
"девяносто"
}
local hundreds = {
"сто",
"двести",
"триста",
"четыреста",
"пятьсот",
"шестьсот",
"семьсот",
"восемьсот",
"девятьсот"
}
local unitsPlural = {
{"", "", ""},
{"тысяча", "тысячи", "тысяч"},
{"миллион", "миллиона", "миллионов"},
{"миллиард", "миллиарда", "миллиардов"},
{"триллион", "триллиона", "триллионов"}
}
local integersPlural = {"рубль", "рубля", "рублей"}
local decimalsPlural = {"копейка", "копейки", "копеек"}
local out = ""
local triplePos = 0
local formatted = string.format("%.2f", sum)
local number = math.floor(tonumber(formatted), 10)
local decimal = formatted:match("%.(%d+)")
function plural(n, titles)
local cases = {3, 1, 2, 2, 2, 3}
local index = 0
if (n % 100 > 4 and n % 100 < 20) then
index = 3
else
index = cases[math.min(n % 10, 5) + 1]
end
return titles[index]
end
function trim(s)
return s:gsub("^%s*(.-)%s*$", "%1")
end
while (number > 0) do
local tripleStr = ""
local tripleUnit = ""
local triple = number % 1000
number = math.floor(number / 1000)
triplePos = triplePos + 1
if (triplePos > 5) then
return ""
end
if (triple > 0) then
local unitPlural = unitsPlural[triplePos]
tripleUnit = plural(triple, unitPlural)
end
if (triple >= 100) then
tripleStr = hundreds[math.floor(triple / 100)]
triple = triple % 100
end
if (triple >= 20) then
tripleStr = tripleStr .. " " .. tens[math.floor(triple / 10)]
triple = triple % 10
end
if (triple >= 1) then
tripleStr = tripleStr .. " " .. ones[triple]
end
-- две тысячи
if (triplePos == 2) then
tripleStr = tripleStr:gsub("один$", "одна"):gsub("два$", "две")
end
out = tripleStr .. " " .. tripleUnit .. " " .. out
end
if (out == "") then
out = zero
end
out = (trim(out) .. " "
.. plural(math.floor(tonumber(sum)), integersPlural) .. " "
.. decimal .. " "
.. plural(decimal, decimalsPlural)):gsub("%s%s", " ")
return out
end