1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Bars, 21 мар 2016.

  1. Автор темы
    Bars

    Bars Старожил Девелопер Пользователь

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

    Для вас (но в первую очередь для себя :p) я полностью сам написал готовую функцию, которая поможет это реализовать:
    Код:
    /**
    * Склоняем слова правильно
    * @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;
    }
    Использование:
    Код:
    int n = 1; // Количество секунд
    String msg = padezh("§2Остал", "ась", "ось", "ось", n) + " §1" + n + padezh("§2 секунд", "а", "ы", "", n);
    player.sendMessage(msg);
    Это отправит игроку сообщение Осталась 1 секунда

    И да, предлагаю создать новый раздел для таких вспомогательных фич :)
     
    Последнее редактирование: 21 мар 2016
  2. Автор темы
    Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    Ещё примеры:
    Код:
    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"
    В моём плагине на одну мини-игру есть такое:
    Код:
    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 попыток
     
    Последнее редактирование: 21 мар 2016
  3. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Мне кажется, я где-то писал аналог в ответах какой-то темы :)
     
  4. Автор темы
    Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    *ля буду, хочу посмотреть)
     
  5. Автор темы
    Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    Все итак поймут, буду я ещё Javadoc создавать
     
  6. Автор темы
    Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    Как ты судишь о профессионализме. Я щедро слил в паблик своё добро и оформил его как захотел.
    Дарёному коню в зубы не смотрят
     
  7. Dereku

    Dereku Старожил Пользователь

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Из меня хреновый документатор, но всё же.
    Код:
    /**
    * Склоняем слова правильно
    * @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;
    }
    Так же это можно решить с помощью свитча, где это будет более читабельно, но по строкам будет немного длиннее.
     
  8. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Опять эти лишние скобочки :) Но + за JavaDoc, Bars учись :))
     
  9. Dereku

    Dereku Старожил Пользователь

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Скобки лишними не бывают.
     
  10. Автор темы
    Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    Неправда, ничего подобного. Я в своё время облазил весь интернет, и таки да, нашёл короткий вариант... но мой оказался короче.
    Я своё мнение сказал
    Спасибо, понял про что вы теперь. А то я не понимал, зачем мне создавать такую целую хреновину)
     
  11. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
  12. Dereku

    Dereku Старожил Пользователь

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Эта хреновина используется создаётся только для того, чтобы не лезть в исходники. Оно и быстрее, и даёт более расширенный вид. Но лично мне понятнее смотреть javadoc из ide.
     
  13. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Без использования в IDE вообще никак :) Невозможно работать без контрол-пробел :)
     
  14. CoolBoy

    CoolBoy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    Xezard
    Спасибо, полезно. Может пригодится)
     

Поделиться этой страницей