1 лось, 2 лося, 5 лосей

Опубликовано в QLua

Функция для закоренелых эстетов. Подбирает правильную форму существительного взависимости от его количества.

 

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


То же самое, но для препроцессора m4

Недостаточно прав для комментирования

Архив QLua