"PHP" / Говнокод #2897 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 Rpsl, (Updated )

Комментарии (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 кирпича )))
    Ответить
    • Поправил.

      Надо вместо
      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;
      Ответить
    • 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" - и всё в том же духе. А вроде русская игра...
    Ответить
    • А я скажу, в чём дело. Русский язык довольно сложен для автоматической обработки и генерации, поэтому и возникают "роботизированные" тексты. В противном случае, некоего монстра "Кровавый Ворон Жатва" придётся просклонять, для множественных чисел, лиц, родов и всего прочего. И неясно как состыковывать.
      Здесь, конечно, получается совсем-совсем не по-русски, но вы ж понели.
      Ответить
      • Я знаю, что английский в этом плане легче. Но мы же живём в России и говорим по-русски. ВоВ локализованный так не режет глаз своими текстами нежели изначально русская игра "Аллоды".
        Ответить
        • Всего кирпичей: Адын :))

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

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

    Давайте тогда еще рассмотрим алгоритм перевода цифр в текст.
    Ответить
  • Вспомнилось из своего аналогичное место, тоже в говно-стиле:
    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 класс, лол.
            Ответить

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8