Смена окончания при подсчёте
Может кому нибудь из читающих форум, будет интересен скриптик!!
При подсчёте чегонибудь, допустим, яблок ... мы меняем окончание когда произносим: 1 яблоко, 2 яблока, 5 яблок ... function wordend(number, word, end1, end2, end3){ if(Number(String(number).length) > 2) number = Number(String(number).substr(-2)); if(number == 11 || number == 12 || number == 13 || number == 14){ return word+end3; } else { switch(Number(String(number).substr(-1))){ case 1: return word+end1; break; case 2:case 3:case 4: return word+end2; break; case 5:case 6:case 7:case 8:case 9:case 0: return word+end3; break; } } } alert(111+' '+wordend(111, 'став', 'ка', 'ки', 'ок')); alert(1+' '+wordend(1, 'яблок', 'о', 'а', '')); alert(5+' '+wordend(5, 'секунд', 'а', 'ы', '')); |
Цитата:
|
Цитата:
alert(1+' '+wordend(1, 'стул', '', 'а', 'ьев')); Меняем везде цифру 1, на любое другое число! И всё работать будет ... Просто надо правильно корень слова взять ... в функции wordend, первый параметр, это количество (времени, предметов и тд), второй параметр - неизменная часть слова, которая будет во всех трёх случаев ... 1 СТУЛ, 2 СТУЛа, 5 СТУЛьев - а из этого вы уже догодались откуда берутся 3,4,5 параметры ... |
function pluralForm ( n, forms ) { return forms[(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2) ]; } //pluralForm( 1, ["стул", "стула", "стульев"] ); |
У каждого свой костыль:)
function num(n, one, two, five) { if ((n = Math.abs(n) % 100) > 4 && n < 21 || (n %= 10) > 4 || n === 0 ) return five; if (n > 1) return two; return one; } |
Мда!! оказывается у меня самый тупой метод =)) Ладно, переделаем ...
|
Вот, вторая попытка!!!
function wordend(num, words){ return words[((num%100 > 10 && num%100 < 15) || num%10 > 4 || num%10 == 0)? 2 : (num%10 == 1)? 0 : 1]; } alert(11+' '+wordend(11, ['стул','стула','стульев'])); |
qwermjk, очевидная оптимизация:
function wordend(num, words){ return words[ ((num=Math.abs(num%100)) > 10 && num < 15 || (num%=10) > 4 || num === 0) ? 2 : num === 1 ? 0 : 1 ]; }Но тут ещё есть куда оптимизировать(напр. последний пункт).) P.S. Math.abs - модуль - нужен чтобы работало и с отрецательными числами. |
Цитата:
Так как с отрицательными числами врядли будет использоваться эта функция!! например так: alert(-11+' '+wordend(11, ['стул','стула','стульев'])); |
Хехех, по идее - наоборот первой проверкой должна стоять проверка "а число ли нам вообще передают", далее должна идти проверка не дробное ли...)
|
Часовой пояс GMT +3, время: 22:06. |