Буквально одной строкой кода...

Автор Serifa, 15 октября 2013, 19:43:20

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Serifa

Пусть простят меня камрады с http://forum.ubuntu.ru/index.php?topic=231010.0, но хочется поделиться откровением :) )

ЦитироватьОкончания рассогласованы с числительными. Это так сильно бросается в глаза, и это так легко реализуется буквально одной строкой кода ...
ЦитироватьУ меня придумать такую строку не получилось. Если у тебя есть вариант — закоммить в SMF. Решать такие вещи на одном отдельно взятом форуме нецелесообразно.
Цитироватьвыделяем функцию-хелпер
Код: [Выделить]

def number_with_noun(number, nouns)
  raise 'There must be 3 members' unless nouns.is_a?(Array) && nouns.size==3
  if (11..14).include? number%100
    '%d %s' % [number, nouns[2]]
  else
    case number%10
      when 1 then '%d %s' % [number, nouns[0]]
      when 2..4 then '%d %s' % [number, nouns[1]]
      else '%d %s' % [number, nouns[2]]
    end
  end
end


далее вызываем её, передавая число и три варианта существительного
Код: [Выделить]

puts number_with_noun 1, %w(ответ ответа ответов)
puts number_with_noun 23, %w(просмотр просмотра просмотров)
puts number_with_noun 862, %w(тема темы тем)
puts number_with_noun 31, %w(сообщение сообщения сообщений)
puts number_with_noun 0, %w(гость гостя гостей)


убеждаемся, что всё работает:
Цитировать
    1 ответ
    23 просмотра
    862 темы
    31 сообщение
    0 гостей

p.s. это был ruby

ЦитироватьФигасе одна строка.

Осталось только
а) переписать на php
б) переделать так, чтобы работало для разных языков в зависимости от конфига
ЦитироватьВот однострочник, но он куда как хуже читается. Не ruby-way. Поэтому я и привел более развернутый вариант - он легче для обзора, понимания, для адаптации на другие языки.

Код: [Выделить]

def number_with_noun(number, nouns)
  "#{number} #{nouns[number%10 == 1 && number%100 != 11 ? 0 : (2..4).include?(number%10) && !(12..14).include?(number%100) ? 1 : 2]}"
end
«- Помощник капитана Бакстер, - заявил Лумис, - безбожно врет. Все отнюдь не под контролем, вернее, не под его контролем. Корабль захвачен представителями небелковой формы разумной жизни, которые маскируются под обслуживающих роботов, а некоторые даже не делают и этого...»
«То, что у тебя есть, лечится антибиотиками» (nowhere man, 1995)
В телеге срочно нужны читатели!

kak2z

я вообще этот однострочник не смог прочитать))
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)