[Util] Склонение по числительным (1 алмаз, 3 алмазА, 5 алмазОВ и т.д.)

  • Автор темы Автор темы Bars
  • Дата начала Дата начала

Bars

Старожил
Девелопер
Пользователь
Баллы
173
Например вы хотите вывести в чат сообщение "Осталось 15 секунд", но чтобы слово "секунд" склонялось в зависимости от числа: "Осталось 3 секунды", "Осталась 1 секунда" и т.п.

Для вас (но в первую очередь для себя :p) я полностью сам написал готовую функцию, которая поможет это реализовать:
Java:
/**
* Склоняем слова правильно
* @param ed неизменяемая часть слова, которую нужно просклонять
* @param a окончание для слова, в случае если число оканчивается на 1
* @param b окончание для слова, в случае если число оканчивается на 2, 3 или 4
* @param c окончание для слова, в случае если число оканчивается на 0, 5...9 и 11...19
* @param n число, по которому идёт склонение
* @return правильно просклонённое слово по числу
*/
public static String padezh(String ed, String a, String b, String c, int n) {
    if (n < 0) n = -n;
    int last = n % 100;
    if (last > 10 && last < 21) return ed + c;
    last = n % 10;
    if (last == 0 || last > 4) return ed + c;
    if (last == 1) return ed + a;
    if (last < 5) return ed + b;
    return ed + c;
}

Использование:
Java:
int n = 1; // Количество секунд
String msg = padezh("§2Остал", "ась", "ось", "ось", n) + " §1" + n + padezh("§2 секунд", "а", "ы", "", n);
player.sendMessage(msg);
Это отправит игроку сообщение Осталась 1 секунда

И да, предлагаю создать новый раздел для таких вспомогательных фич :)
 
Последнее редактирование:
Ещё примеры:
Java:
Bukkit.broadcastMessage(4 + padezh(" игрок", "", "а", "ов", 4) + " онлайн"); // Оповестит на весь сервер, что сейчас "4 игрока онлайн"
player.sendMessage("На твоём игровом счёте " + 1391 + padezh(" монет", "а", "ы", "", 1391)); // Отправит игроку сообщение "На твоём игровом счёте 1391 монета"
Bukkit.getLogger().info("Player Bars has " + 12 + padezh(" region", "", "s", "s", 12)); // Выведет в консоль "Player Bars has 12 regions"

В моём плагине на одну мини-игру есть такое:
Java:
int h = (int)p.getHealth();
if (plugin.titles) TitleAPI.sendTitle(p, 5, 30, 5, "§6Надо быть осторожнее :)", padezh("§cОстал", "ась", "ось", "ось", (int)(h/2)) + " §e" + (int)(h/2) + padezh("§c попыт", "ка", "ки", "ок", (int)(h/2)));
Осталась 1 попытка
Осталось 2 попытки
Осталось 10 попыток
 
Последнее редактирование:
Мне кажется, я где-то писал аналог в ответах какой-то темы :)
 
Видно, какой ты "профи", если так сложно написать специальный комментарий, который ide будет понимать.
Как ты судишь о профессионализме. Я щедро слил в паблик своё добро и оформил его как захотел.
Дарёному коню в зубы не смотрят
 
Из меня хреновый документатор, но всё же.
Java:
/**
* Склоняем слова правильно
* @param ed неизменяемая часть слова, которую нужно просклонять
* @param a окончание для слова, в случае если число оканчивается на 1
* @param b окончание для слова, в случае если число оканчивается на 2, 3 или 4
* @param c окончание для слова, в случае если число оканчивается на 0, 5...9 и 11...19
* @param n число, по которому идёт склонение
* @return правильно просклонённое слово по числу
*/
public static String padezh(String ed, String a, String b, String c, int n) {
    if (n < 0) {
        n = -n;
    }
    int last = n % 100;
    if (last > 10 && last < 21) {
        return ed + c;
    }
    last = n % 10;
    if (last == 0 || last > 4) {
        return ed + c;
    }
    if (last == 1) {
        return ed + a;
    }
    if (last < 5) {
        return ed + b;
    }
    return ed + c;
}

Так же это можно решить с помощью свитча, где это будет более читабельно, но по строкам будет немного длиннее.
 
Опять эти лишние скобочки :) Но + за JavaDoc, Bars учись :-))
 
Это добро легко находится гуглением "java склонение числительных". Причём варианты есть с меньшим кол-вом строк.
Неправда, ничего подобного. Я в своё время облазил весь интернет, и таки да, нашёл короткий вариант... но мой оказался короче.
Я своё мнение сказал
Из меня хреновый документатор, но всё же.
Спасибо, понял про что вы теперь. А то я не понимал, зачем мне создавать такую целую хреновину)
 
Без использования в IDE вообще никак :) Невозможно работать без контрол-пробел :)
 
Спасибо, полезно. Может пригодится)
 
Назад
Верх