-
Star
(329)
You must be signed in to star a gist -
Fork
(73)
You must be signed in to fork a gist
-
-
Save realmyst/1262561 to your computer and use it in GitHub Desktop.
function declOfNum(number, titles) { | |
cases = [2, 0, 1, 1, 1, 2]; | |
return titles[ (number%100>4 && number%100<20)? 2 : cases[(number%10<5)?number%10:5] ]; | |
} | |
use: | |
declOfNum(count, ['найдена', 'найдено', 'найдены']); |
Согласен с malefique. Автору спасибо.
function declOfNum(n, titles) {
return titles[n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2];
}
Автору спасибо!
@zxqfox'у спасибо тоже )
Thank you! You helped me to save time. :)
А как быть с числами с плавающей точкой, например 3.3?
@hazratgs, с плавающей окончание не меняется ("часть" яблока)
1.2 яблока
3.5 яблока
12.3 яблока
@retyui, спасибо. но:
number = Math.abs(number);
нужно перенести в подфункцию в первом варианте
@zxqfox забыли скобочку.
declOfNum(n, titles) {
return titles[(n % 10 === 1 && n % 100 !== 11) ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2]
}
Спасибо огромное!
@zxqfox Спасибо! ;)
Очень кратко и полезно.
Спасибо!
🔥
@zxqfox большое спасибо за наводку!
Чую автор взял код отсюда http://internetbrains.blogspot.com/2010/01/javascript.html
@pauldasslier чую не взял, а спиздил 😃
@pauldasslier @lloydbanks тихо спздл и ушел, называется нашел. Ни признать, ни опровергнуть - не могу, это было 8 лет назад лол. Я и не знал, что тут активность какая-то, гитхаб не смог в нотификации :)
Спасибо!
Спасибо!
Спасибо!
Спасибо!!!
Спасибо!!!
Нашел статью по теме с еще одним вариантом реализации этой задачи https://sitedev.ru/correct-word-close-to-number/
Для определения правильной формы существительного рядом с числом (счетная форма) сам использую вариант автора, но адаптированный под дробные (не целые) числа:
CountForm = (number, titles) => {
number = Math.abs(number);
if (Number.isInteger(number)) {
cases = [2, 0, 1, 1, 1, 2];
return titles[ (number%100>4 && number%100<20)? 2 : cases[(number%10<5)?number%10:5] ];
}
return titles[1];
}
Использование:
CountForm(count, ['рубль', 'рубля', 'рублей']);
Спасибо!
Спасибо!!!
export function countFormat(
number: number,
one: string,
two: string,
five: string
): string {
let absNumber = Math.abs(number);
absNumber %= 100;
if (number >= 5 && number <= 20) return five;
absNumber %= 10;
if (absNumber === 1) return one;
if (absNumber >= 2 && absNumber <= 4) return two;
return five;
}
function declOfNum(count, one, two, few) {
return [few, one, two, two, two, few][count % 100 > 10 && count % 100 < 20 ? 0 : Math.min(count % 10, 5)]
}
JSDoc + Using new ES features + can return number with declined string
/**
* Declines depending on the number
* @param {number} number
* @param {string[]} titles Strings for decline
* @param {boolean} [full=false] If true - returns number + string
* @return {string}
*/
export function declOfNum (number, titles, full = false) {
const cases = [2, 0, 1, 1, 1, 2]
const result = titles[(number % 100 > 4 && number % 100 < 20) ? 2 : cases[(number % 10 < 5) ? number % 10 : 5]]
return full ? `${number} ${result}` : result
}
retyui наркоман