1. PHP / Говнокод #2897

    +180

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    function writeTotalEntries()
        {
            $cnt = $this->totalentries;
            if ($cnt == 0) {
                return "записей нет";
            } elseif ($cnt == 1)
            {
                return "1 запись";
            } elseif ($cnt == 2)
            {
                return "2 записи";
            } elseif ($cnt == 3)
            {
                return "3 записи";
            } elseif ($cnt == 4)
            {
                return "4 записи";
            } elseif ($cnt == 5)
            {
                return "5 записей";
            } elseif ($cnt == 6)
            {
                return "6 записей";
            } elseif ($cnt == 7)
            {
                return "7 записей";
            } elseif ($cnt == 8)
            {
                return "8 записей";
            } elseif ($cnt == 9)
            {
                return "9 записей";
            } elseif (($cnt >= 10) && ($cnt <= 20))
            {
                return $cnt." записей";
            } elseif ($cnt%10 == 1)
            {
                return $cnt." запись";
            } else
            {
                return $cnt." записей";
            }
        }

    Было найдено в одном из проектов.

    Запостил: Rpsl, 30 Марта 2010

    Комментарии (28) RSS

    • БыДло найдено в одном из проектов.
      Ответить
    • "22 записей"
      Прежде чем браться за всякие страшные языки не мешает выучить родной.
      Ответить
    • function word_counting($n){
        $words = array('Кирпичей','Кирпич','Кирпича');
        $word_end = 0;
        switch($n%10){
          case 1: $word_end = 1;break;
          case 2:
          case 3:
          case 4: $word_end = 2;break;
        }
        if($n > 10 AND $n < 15)$word_end = 0;
        return $n.' '.$words[$word_end];
      }
      for($i=0;$i<100;$i++)
        echo word_counting($i).'<br>';


      Только тут будет 114 кирпича )))
      Ответить
      • 111 кирпич?
        Ответить
      • Поправил.

        Надо вместо
        if($n > 10 AND $n < 15)$word_end = 0;


        Воткнуть

        if(!(($n-11)%100) OR !(($n-12)%100) OR !(($n-13)%100) OR !(($n-14)%100))$word_end = 0;
        Ответить
        • 101 кирпичей? :)
          Ответить
          • У меня показывает 101 кирпич
            Ответить
            • Пардон, это я тупой уебан не правильно посчитал. Теперь красиво :)
              Ответить
        • Или
          if(substr($n, -2) > 10 AND substr($n, -2) < 15) $word_end = 0;
          Ответить
      • function counting($x)
        {
        	$w = array(/* 1 */ 'Кирпич', /* 2 */ 'Кирпича', /* 5 */ 'Кирпичей');
        	$d = ($p = $x % 100) % 10;
        	return $x . ' ' . $w[ $p == 11 || $d == 0 || ($p >= 10 && $p <= 20) || ($d >= 5 && $d <= 9) ? 2 : ($d == 1 ? 0 : 1) ];
        }

        так красивее, по-моему.
        Ответить
        • Да, это тема. Массив нужно передавать в аргументах (лучше просто 3 окончания).
          Ещё встречал вариант с регэкспом (вроде всего один), правда мудрёный.
          Для массива лучше использовать не 1, 2, 5, а 0, 1, 2, так аккуратнее, по порядку.
          Ответить
        • А зачем там указывать, что $p == 11 ?
          Достаточно того, что $p между 10 и 15.

          function counting($n,$words=array('','','')){//one,few,lot
            $x = ($xx = $n%100)%10;
            return $n.' '.$words[($xx>10 AND $xx<15 OR !$x OR $x>4 AND $x<10)?2:($x == 1?0:1)];
          }
          
          for($i=900;$i<1130;$i++)
            echo counting($i,array('Кирпич','Кирпича','Кирпичей')).'<br>';
          Ответить
          • точно, только не между 10 и 15, а между 10 и 20 включительно.
            111 кирпичей, 120 кирпичей, 11 кирпичей, 117 кирпичей etc.
            Ответить
            • А какая разница, если на конце от 5-ти до 9-ти или ноль, то по-любому будет "кирпичей".
              .... OR !$x OR $x>4 AND $x<10)

              Ну короче это на своё усмотрение. Просто будет некритичное пересечение условий.
              Ответить
    • Как же красиво и легко всё делается в английском языке. 1st, 2nd, 3rd, 4th.. И количественная мера одна - единица или множество.
      Ответить
      • А в эсперанто так вообще только множественное число на -j и всё. Ах, как же красиво и просто все в эсперанто!
        Да?
        Ответить
    • Это конечно плохой код, но это лучше, чем вообще без такой функции.

      Гораздо хуже когда язык вообще не хотят использовать по-русски. Зашёл недавно на Аллоды Онлайн, посмотрел скришоты: "Получена валюта Очко умений в количестве 2" - и всё в том же духе. А вроде русская игра...
      Ответить
      • А я скажу, в чём дело. Русский язык довольно сложен для автоматической обработки и генерации, поэтому и возникают "роботизированные" тексты. В противном случае, некоего монстра "Кровавый Ворон Жатва" придётся просклонять, для множественных чисел, лиц, родов и всего прочего. И неясно как состыковывать.
        Здесь, конечно, получается совсем-совсем не по-русски, но вы ж понели.
        Ответить
        • Я знаю, что английский в этом плане легче. Но мы же живём в России и говорим по-русски. ВоВ локализованный так не режет глаз своими текстами нежели изначально русская игра "Аллоды".
          Ответить
        • Всего кирпичей: X
          тоже вариант
          Ответить
          • Всего кирпичей: Адын :))

            Вообще, была где-то статья про локализацию забугорных игр -- тот еще геморрой.

            А так -- банальная лень.
            Ответить
    • Конструктивно пообщались. Вот в этом суть говнокда.ру.

      Давайте тогда еще рассмотрим алгоритм перевода цифр в текст.
      Ответить
    • Вспомнилось из своего аналогичное место, тоже в говно-стиле:
      case PCount of
              0: CountPoint.Caption := 'Маршрут не задан';
              1: CountPoint.Caption := '1 точка (маршрут не задан)';
              2 .. 4, 22 .. 24, 32: CountPoint.Caption := IntToStr(PCount) + ' точки';
              5 .. 20, 25 .. 30: CountPoint.Caption := IntToStr(PCount) + ' точек';
              21, 31: CountPoint.Caption := IntToStr(PCount) + ' точка';
            end;
      Ответить
      • Ну это, если диапазон строго ограничен. А так -- говно.

        Кстате...
        Остаток от деления отрицательного числа -- отрицательный.
        Следовательно, не забывайте использовать функцию abs($n);
        Ответить
        • > Остаток от деления отрицательного числа -- отрицательный.

          Кстати самому интересно - это откуда такой глюк берётся?
          Ответить
          • Что бы сохранялось равенство ИсходноеЧисло = РезультатЦелочисленногоДеления*Делитель + Остаток
            Ответить
            • -7 div 4 = -2
              -7 mod 4 = 1

              Вот как надо, и равенство сохранится. Математика, 3 класс, лол.
              Ответить
    • Вамбырусскийпоучить.
      Ответить

    Добавить комментарий