1 лось, 2 лося, 5 лосей
Функция для закоренелых эстетов. Подбирает правильную форму существительного взависимости от его количества.
function string.ending(what,end1,end234,default) what = tostring(math.floor(what)) return what:sub(-2,-2) ~= "1" and ({ ["1"] = end1,
["2"] = end234,
["3"] = end234,
["4"] = end234 })[what:sub(-1)] or default
end
Lua - забавный язычок. Не приходилось встречать столь лаконичных функций на других языках. Проверим, как работает:
for i=0,30 do
print(i, string.ending(i,"лось","лося","лосей"),
string.ending(i,"секунда","секунды","секунд"),
string.ending(i,"облако","облака","облаков"))
end
Получаем
0 лосей секунд облаков
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 лосей секунд облаков
UPDATE
Для Lua 5.3 функция должна выглядеть слегка иначе:
function string.case(x,end1,end234,others)
-- Для нецелых чисел
x = math.tointeger(x)
if not x then
return end234
end
-- Для целых чисел
x = tostring(x)
return x:sub(-2,-2) ~= "1" and ( {["1"] = end1,
["2"] = end234,
["3"] = end234,
["4"] = end234
})[x:sub(-1)] or others
end